【问题标题】:Can you build dynamic libraries for iOS and load them at runtime?您可以为 iOS 构建动态库并在运行时加载它们吗?
【发布时间】:2011-06-11 15:43:48
【问题描述】:

iOS (iPhone/iPad) 是否支持动态库?

在 Xcode 中,我尝试创建一个新项目 -> 框架和库 -> Cocoa 库(动态)。在项目设置中,我将Base SDK设置为iOS device 4.1,目标设置为iOS4.1,但是编译出错:

target 指定产品类型“com.apple.product-type.library.dynamic”,但“iphonesimulator”平台没有这样的产品类型。

我选择的构建是Simulator -> Debug -> i386

【问题讨论】:

标签: ios xcode dylib


【解决方案1】:

从 Xcode 11.4.1 开始,不允许使用动态库(您的项目不会针对所有目标进行编译)。使用 libs/frameworks 的新方法是来自 xcodebuild 的 create-xcframework。

【讨论】:

    【解决方案2】:

    我并不是真的不同意DarkDust's answer,但如果我可以引导我内心的比尔克林顿,it depends on what the meaning of supported is:)

    Apple 不希望您为 App Store 应用程序这样做,但操作系统当然允许这样做。越狱应用程序一直使用这种技术。您基本上使用标准 UNIX 技术来动态打开框架/库,然后使用其中的内容。 dlopen function 允许您通过传入 the path to that framework 或 dylib 来打开库。来自一些docs for building jailbreak apps,这是一个调用init() 函数的示例,该函数在您自己的独立dylib 中实现:

    #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);
        }
    }
    

    此外,允许您构建适用于 iOS 的动态库项目的默认限制是 Xcode 中的某些内容,您可以通过编辑一些 XCode xml 文件来覆盖:

    Build and use dylib on iOS

    完成此操作后,您可以构建一个普通的 iOS .dylib 库,并按照上面的示例代码使用它。 (是的,每当您安装新的 XCode 版本时,您可能必须再次解锁此功能。

    所以,这不是技术限制,而是 App Store 政策限制。如果您不限于 App Store,那么您可以做到。请注意,这种技术不需要越狱,但如果应用程序是沙盒的,它可能会限制 dylib 可以从哪里加载。

    编辑:为了确保此信息不会因将来的链接失效而丢失,这里是我提供的有关如何在 Xcode 中启用 iOS dylib 的链接内容。 (注意:此过程仍然适用于 Xcode 4,但请参阅下面的评论以了解路径等的更新。来源是 iOS Place blog


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

    1.在属性列表编辑器中打开这些文件:/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications/iPhone Simulator ProductTypes.xcspec

    2.在“MacOSX Product Types.xcspec”中找到产品类型为com.apple.product-type.library.dynamic的项目并将其拖到“iPhone Simulator”中ProductTypes.xcspec”。

    3. 打开位于相同位置的“MacOSX Package Types.xcspec”和“iPhone Simulator PackageTypes.xcspec”。 p>

    4. 在“MacOSX Product Types.xcspec”中找到包类型为com.apple.package-type.mach-o-dylib的项目,并将其拖到“iPhone Simulator”中PackageTypes.xcspec”。

    5. 对“iPhoneOS.platform”重复这些步骤,如果 Xcode 正在运行,请重新启动它。

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

    1. 在文本编辑器中打开文件 project.pbxproj(在 Xcode 项目文件包中找到)。搜索字符串“producttype”,将其值改为com.apple.product-type.library.dynamic

    现在,用 Xcode 打开项目,进入 Project->Edit Project Settings

    2.安装目录”设置为@executable_path/,因为我打算将 dylib 与应用程序的可执行文件放在同一目录中。

    3.Mach-O 类型”设置为动态库

    4.可执行扩展”设置为dylib

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

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

    现在,创建一个应用来测试它。这一次,我选择基于视图的应用程序。连接一个 UIButton 和一个 UILabel 来调用库并显示返回消息。你可以download the complete project TestApp玩玩。

    【讨论】:

    • 从 XCode 4.5 开始,这些文件可以在(例如)/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications 中找到
    • @ChrisDevereux,谢谢!我写了一个注释来检查您对最新路径的评论......当然,在未来的版本中可能会再次改变:)
    • 这个答案需要更多的支持(并且应该是真正被接受的答案,但我怀疑 user510951 在离开 SO 2 年后会回来)。很好的回答内特!
    • 应该有某种主覆盖,如果@chown 说答案是正确的......它非常正确。
    • @Panagiotis,请发布一个新问题,以便正确解决此问题。显示您正在使用的代码以及所有错误消息。如果需要,您可以链接回此问题/答案。如果您添加“iphone-privateapi”标签,我会看到它。您应该声明这不适用于应用商店,否则人们可能会投票结束该问题。
    【解决方案3】:

    在提出这个问题时,iOS 不支持动态库,这将导致您的应用被拒绝。只允许使用静态库。

    不过,在 iOS8 中,您可以使用动态库和框架。它应该“正常工作”

    【讨论】:

    • 有人知道这是为什么吗?对我来说,这似乎完全是疯了。
    • @Erik de Castro Lopo:原因是安全性:因为动态库可以在运行时加载和卸载,您可以下载额外的可执行代码并加载它(想想插件在)。这可能会被黑客入侵,然后在您的手机上执行恶意代码是一件非常糟糕的事情。它还可以将未经批准的功能添加到已批准的应用程序中。简而言之:在这种环境下,Apple 认为动态链接是一个必须严格控制的潘多拉魔盒,否则可能会危及安全性,我同意它在手机上确实有意义。
    • 我正在开发一个不会通过 AppStore 分发的内部应用程序,所以我不关心 Apple 对 AppStore 的限制。 技术上是否可以为 iOS 应用创建动态库?
    • @Aliaksei:技术上是的,否则您将无法链接到 Apple 的库。 AFAIK 动态库支持与 Mac OS X 上的差不多。但是,Xcode 不支持它,但似乎您可以使用捆绑包。 See this article.
    • 不支持不等于不允许。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    相关资源
    最近更新 更多