将.dylib嵌入iOS框架

时间:2018-12-17 15:59:33

标签: ios swift xcode frameworks dynamic-library

我一直在尝试提交带有Obj-C动态库(.dylib)的Swift应用,该库一直被iOS App Store拒绝,并显示诸如

的错误消息
  

无效的Swift支持-文件libswiftDarwin.dylib,   libswiftDispatch.dylib,libswiftCoreGraphics.dylib,   libswiftUIKit.dylib,libswiftCore.dylib,libswiftFoundation.dylib,   libswiftQuartzCore.dylib,libswiftObjectiveC.dylib,   libswiftCoreImage.dylib不在预期的位置   /有效载荷//框架。将文件移到期望的位置   位置,请使用当前的公共(GM)版本重建您的应用   Xcode,然后重新提交

https://developer.apple.com/library/archive/technotes/tn2435/_index.html#//apple_ref/doc/uid/DTS40017543-CH1-PROJ_CONFIG-APPS_WITH_DEPENDENCIES_BETWEEN_FRAMEWORKS处的Apple文档中,错误“ 可能表明您的应用嵌入了未打包为框架的动态库。框架捆绑包之外的动态库,通常具有文件扩展名.dylib,在iOS,watchOS或tvOS上不受支持,除了Xcode提供的系统Swift库。

因此,下一步是将动态库(作为子项目)嵌入Cocoa Touch Framework项目中。一旦设置完成,尽管框架构建良好,但我陷入了导入的dylib类的“找不到符号”错误。

我想知道实现此项目结构所需的步骤,甚至在iOS上也可以。

1 个答案:

答案 0 :(得分:1)

我能够通过首先创建一个框架来提交带有.dylib的应用程序。 我首先尝试了苹果文档中描述的方法,但是在提交到商店时遇到错误(“无效的捆绑包。xyz.framework的捆绑包包含不允许的文件'Frameworks')

我所做的是使用lipo手动将.dylib打包到框架中。

$ lipo -create mylib.dylib -output mylib

现在,您将获得一个名为“ mylib”的二进制文件。 创建一个名为mylib.framework的文件夹,然后将二进制文件放入其中。 然后添加一个Info.plist(您可以只复制和修改现有框架中的一个。)在Info.plist中,填写框架的字段。要更新或添加的主要文件是“可执行文件”,它应该是该二进制文件的名称。

我有另一个问题,我正在使用的另一个框架引用了我原来的.dylib,该.dylib已经不存在了,现在位于框架中。为了解决这个问题,我使用“ install_name_tool”来修改其他框架以寻找我的新框架。

$ cd OtherLib.framework 
$ install_name_tool -change @rpath/mylib.dylib @rpath/mylib.framework/mylib OtherLib

您可以在这篇优秀的博客文章中了解有关该工具的更多信息: https://medium.com/@donblas/fun-with-rpath-otool-and-install-name-tool-e3e41ae86172