您可以为iOS构建动态库并在运行时加载它们吗?

use*_*951 111 xcode dylib ios

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

在Xcode中,我尝试创建一个新项目 - > Framework&Library - > Cocoa Library(动态).在项目设置,我设置了基地SDKiOS device 4.1和目标iOS4.1,但它有一个内置的错误:

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

我选择的构建是模拟器 - >调试 - > i386.

Nat*_*ate 159

我并不是真的不同意DarkDust的答案,但如果我可以引导我内心的比尔克林顿,那取决于支持的含义是什么 :)

Apple不希望您为App Store应用程序执行此操作,但操作系统当然允许它.越狱应用程序一直使用这种技术.您基本上使用标准的UNIX技术来动态打开框架/库,然后使用其中的东西.该dlopen的功能,您可以通过在传递给打开库的路径框架,或dylib.从一些用于构建越狱应用程序的文档中,这里是一个调用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在iOS上构建和使用dylib

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

因此,这不是技术限制,而是App Store政策限制.如果您不仅限于App Store,那么您可以这样做.请注意,这种技术并没有要求越狱,但如果应用程序是沙箱,它可以限制在那里 dylibs可以被加载.



编辑:为了确保此信息不会丢失到未来的链接腐烂,这里是我提供的关于如何在Xcode中启用iOS dylibs的链接的内容.(注意:此过程仍适用于Xcode 4,但请参阅下面的注释以了解路径更新等.)来源是iOS Place博客:


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产品Types.xcspec/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications/iPhone模拟器ProductTypes.xcspec

2.找到具有产品类型的" MacOSX Product Types.xcspec "中的项目,com.apple.product-type.library.dynamic并将其拖到" iPhone Simulator ProductTypes.xcspec ".

Xcode截图1

3.在相同位置打开" MacOSX Package Types.xcspec "和" iPhone Simulator PackageTypes.xcspec ".

4.找到具有包类型的" MacOSX Product Types.xcspec "中的项目,com.apple.package-type.mach-o-dylib并将其拖到" iPhone Simulator PackageTypes.xcspec ".

Xcode截图2

5.重复" iPhoneOS.platform " 的步骤,并重新启动Xcode(如果它正在运行).

现在,让我们构建一个dylib.从" Cocoa Touch Static Library "Templete开始.这应该包括项目中的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 Type "设置为动态库

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

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

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

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

  • 这个答案需要更多的赞成(并且应该是接受的答案,但我怀疑user510951将在离开SO 2年后回来).非常好的答案Nate! (3认同)
  • 从XCode 4.5开始,可以在(例如)/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications中找到这些文件. (2认同)

Dar*_*ust 102

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

但是,在iOS8中,您可以使用动态库和框架.应该"只是工作"

  • @Erik de Castro Lopo:原因是安全性:因为动态库可以在运行时加载和卸载,你可以*下载*额外的可执行代码并加载它(想想插件).这可能会被黑客攻陷,然后在手机上执行恶意代码是一件非常糟糕的事情.它还可以将未经批准的功能添加到已批准的应用程序中.简而言之:在这种环境下,Apple认为动态链接是必须严格控制的潘多拉魔盒,否则会危及安全性,我同意它在手机*上有意义*. (72认同)
  • 谁知道为什么会这样?对我而言,这似乎完全是疯了. (14认同)
  • 我正在开发一个内部应用程序,不会通过AppStore分发,所以我不关心Apple对AppStore的限制.是否_technically_可以为iOS应用程序创建动态库? (6认同)
  • @Aliaksei:技术上是的,否则你将无法链接到Apple的库.AFAIK动态库支持与Mac OS X大致相同.但是,Xcode不支持它,但似乎你可以使用bundle.[见本文](http://www.macosxguru.net/article.php?story=20110712175443515&mode=print). (3认同)
  • 不支持与不允许不一样. (2认同)