Can you build dynamic libraries for iOS and load them at runtime?

IOS (iPhone/iPad)支持动态库吗?

在 Xcode 中,我尝试创建一个 新项目-> 架构及图书馆-> Cocoa 库(动态)。在项目设置中,我将 SDK 基地设置为 iOS device 4.1,目标设置为 iOS4.1,但它有一个构建错误:

Target 指定产品类型‘ com.apple.product-type. library. Dynamic’,但‘ iphonesimator’平台没有这样的产品类型”。

我选择的版本是 Simulator -> Debug -> i386

97745 次浏览

At the time this question was asked, Dynamic libraries were not supported by iOS and will result in your app getting rejected. Only static libraries are allowed.

然而,在 iOS8中你可以使用动态库和框架,它应该“只是工作”

我并不是真的不同意 DarkDust's answer,但如果我可以引导我的内心比尔克林顿,这取决于受支持的 < em > 的含义是什么:)

苹果不希望你在应用商店的应用程序上这样做,但是操作系统肯定允许这样做。越狱应用程序一直在使用这种技术。基本上可以使用标准的 UNIX 技术动态打开一个框架/库,然后在其中使用内容。Dlopen 函数允许您通过传入 这个框架的路径或 dylib 来打开库。从一些 docs for building jailbreak apps中,下面是一个调用在您自己的独立 dylib 中实现的 init()函数的例子:

#include <dlfcn.h>


initWrapper() {
char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";
    

void *libHandle = dlopen(dylibPath, RTLD_NOW);
if (libHandle != NULL) {
// This assumes your dylib’s init function is called init,
//    if not change the name in "".
void (*init)() = dlsym(libHandle, "init");
if (init != NULL)  {
init();
}
dlclose(libHandle);
}
}

此外,在 XCode,不允许你使用动态库项目的默认限制是你可以通过编辑一些 XCode xml 文件来覆盖的:

在 iOS 上构建和使用 dylib

这样做之后,就可以构建一个普通的 iOS。 dylib库,并按照上面的示例代码使用它。(是的,当您安装新的 XCode 版本时,可能需要再次解锁此功能)。

所以,这不是技术上的限制,而是应用商店的政策限制。如果你不局限于应用程序商店,那么你可以这样做。请注意,这种技术的 not需要越狱,虽然如果应用程序是沙箱,它可能限制 哪里 dylibs 可以从加载。

编辑: 为了确保这些信息不会丢失到未来的链接中,下面是我提供的关于如何在 Xcode 启用 iOS dylibs 的链接内容。(注:这个过程仍然在 Xcode 4上运行,但是请参阅下面的注释,了解路径的更新,等等)源代码是 IOS Place 博客:


Xcode 不允许为 iOS 构建 dylib。应用程序将被拒绝,如果它不是单二进制。但是我有一个应用程序,它具有加载可选模块的插件架构。我只是想要一个快速的原型,以证明概念之前,完全移植到 iOS。如果 dylib 可以简单地工作,那么做起来会更快。因此,这篇文章展示了如何构建和使用 dylib,但是要注意它不会被应用商店批准。(在10.6.4上使用 Xcode 3.2.4进行测试)

1. 在属性列表编辑器中打开这些文件: 开发者/平台/MacOSX.Platform/开发者/库/Xcode/规范/MacOSX 产品类型和 < strong >/Developer/Platforms/iPhoneSimulator.Platform/Developer/Library/Xcode/Specials/iPhone Simulator ProductTypees.xcspec

2. Locate the item in the “MacOSX 产品类型” that has the product type com.apple.product-type.library.dynamic and drag it to the “IPhone 模拟器 ProductTypees.xcspec”.

Xcode screenshot 1

3. 在同一地点打开“ MacOSX 包类型”和“ iPhone Simulator PackageTypes.xcspec”。

4. 在“ MacOSX 产品类型”中找到包类型为 com.apple.package-type.mach-o-dylib的项目,并将其拖动到“ IPhone 模拟器 PackageTypees.xcspec”。

Xcode screenshot 2

5. 重复“ IPhone 操作系统平台”的步骤,如果 Xcode 正在运行,则重新启动它。

现在,让我们构建一个 dylib。从“ 可可触摸静态库”模板开始。这应该包括项目中的 Foundation.Framework。下面是我在构建 dylib 的模板之上所做的更改。

1. Open the file Project. pbxproj (found inside the Xcode project file bundle) in a Text Editor. Search for string “产品类别”, change it’s value to com.apple.product-type.library.dynamic;

现在,用 Xcode 打开项目,转到 项目-> 编辑项目设置

2.安装指南” set to @executable_path/ because I plan to put the dylib in the same directory as the app’s executable.

3.Mach-O 型” set to Dynamic Library

4. “ Executable Extension”设置为 dylib

5. 可执行前缀”设置为空

6. 添加一两个简单的方法到库中并构建它。

现在,创建一个应用程序来测试它。这次,我选择 基于视图的应用程序。连接一个 UIButton 和一个 UILabel 来调用 lib 并显示返回消息。你可以 下载完整的 TestApp 项目和玩它。

失落的知识: 下面的屏幕截图与现在不工作的链接有关。 Build and use dylib on iOS enter image description here enter image description here

从 Xcode 11.4.1开始,不允许使用动态库(您的项目不会为所有目标编译)。使用 libs/框架的新方法是 xcodebuild 中的 create-xcFramework。