你可以为iOS构builddynamic库并在运行时加载它们吗?
iOS(iPhone / iPad)支持dynamic库吗?
在Xcode中,我试图创build一个新项目 – > 框架和库 – > cocoa库(dynamic) 。 在项目设置中,我将Base SDK设置为iOS device 4.1
,目标为iOS4.1
,但是它存在构build错误:
target指定产品types“com.apple.product-type.library.dynamic”,但“iphonesimulator”平台没有这种产品types。
我select的版本是模拟器 – >debugging – > i386 。
在问这个问题的时候,dynamic库不被iOS支持,并会导致你的应用程序被拒绝。 只有静态库是允许的。
但是,在iOS8中,您可以使用dynamic库和框架。 它应该“只是工作”
我并不是完全不同意DarkDust的回答 ,但是如果我可以引导我的内部比尔·克林顿, 这取决于支持的意义是什么 🙂
苹果不希望你这样做的App Store应用程序,但操作系统肯定允许它。 越狱应用程序一直使用这种技术。 您基本上使用标准的UNIX技术来dynamic地打开框架/库,然后使用它的东西。 dlopen函数允许您通过传递该框架或dylib 的path来打开库。 从构build越狱应用程序的一些文档 ,这里是一个调用一个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 构builddynamic库项目的默认限制是XCode中的某些内容,您可以通过编辑某些XCode xml文件来进行重写:
在iOS上构build和使用dylib
一旦你这样做,你可以build立一个正常的iOS .dylib库,并按照上面的示例代码使用它。 (是的,当您安装新的XCode版本时,您可能将不得不再次解锁此function)。
所以,这不是技术限制,而是App Store的政策限制。 如果你不限于App Store,那么你可以做到这一点。 请注意,这种技术不需要越狱,但如果应用程序是沙盒,它可能会限制dylibs可以从哪里加载。
编辑:为了确保这个信息不会丢失到未来的链接腐烂,这里是我提供的关于如何在Xcode中启用iOS dylib的链接的内容。 ( 注意:这个过程在Xcode 4上仍然有效,但是请参阅下面的path更新的评论等等)。Source是iOS Place博客 :
Xcode不允许你为iOS构builddylib。 如果不是单个二进制文件,应用程序将被拒绝。 但是我有一个具有插件架构来加载可选模块的应用程序。 我只是想要一个快速的原型来certificate概念,然后将其完全移植到iOS。 如果dylib可以简单地工作,那么做的更快。 所以,这篇文章展示了如何构build和使用dylib,但是请注意它不会被批准到App Store。 (在10.6.4上用Xcode 3.2.4testing)
1.在属性列表编辑器中打开这些文件: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec和/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications / iPhone模拟器ProductTypes.xcspec
2.find具有产品typescom.apple.product-type.library.dynamic
的“ MacOSX Product Types.xcspec ”中com.apple.product-type.library.dynamic
,并将其拖到“ iPhone Simulator ProductTypes.xcspec ”。
3.在相同的地方打开“ MacOSX Package Types.xcspec ”和“ iPhone Simulator PackageTypes.xcspec ”。
4.find具有包typescom.apple.package-type.mach-o-dylib
的“ MacOSX Product Types.xcspec ”中的项目,并将其拖到“ iPhone Simulator PackageTypes.xcspec ”中。
5.重复“ iPhoneOS.platform ”的步骤,如果Xcode正在运行,则重新启动。
现在,让我们build立一个dylib。 从“ Cocoa Touch Static Library ”Templete开始。 这应该包括项目中的Foundation.framework。 以下是我在模板上创builddylib的更改。
1.在文本编辑器中打开文件project.pbxproj (在Xcode项目文件包中find)。 searchstring“ producttype ”,将其值更改为com.apple.product-type.library.dynamic
;
现在,用Xcode打开项目,进入Project-> Edit Project Settings
2. “ 安装目录 ”设置为@executable_path/
因为我打算把dylib放在与应用程序可执行文件相同的目录中。
3. “ Mach-O Type ”设置为dynamic库
4. “ 可执行扩展名 ”设置为dylib
5. “ 可执行前缀 ”设置为空
6.添加一个或两个简单的方法到库中并构build它。
现在,创build一个应用程序来testing它。 这一次,我select了基于视图的应用程序 。 连接一个UIButton和一个UILable来调用lib并显示返回消息。 您可以下载完整的项目TestApp并使用它。