在 iOS 框架中嵌入 .dylib

Ada*_*ski 7 xcode frameworks dynamic-library ios swift

我一直在尝试提交一个带有 Obj-C 动态库 (.dylib) 的 Swift 应用程序,但它不断被 iOS 应用商店拒绝,并显示错误消息,例如

\n\n
\n

无效 Swift 支持 - 文件 libswiftDarwin.dylib、\n libswiftDispatch.dylib、libswiftCoreGraphics.dylib、\n libswiftUIKit.dylib、libswiftCore.dylib、libswiftFoundation.dylib、\n libswiftQuartzCore.dylib、libswiftObjectiveC.dylib、\n libswiftCoreImage.dylib 为\xe2\x80\x99t 位于预期位置\n /Payload//Frameworks。将文件移动到预期位置,使用当前公共 (GM) 版本的 Xcode 重新构建应用程序,然后重新提交

\n
\n\n

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

\n\n

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

\n\n

我想知道实现这个项目结构所需的步骤,或者它是否可以在 iOS 上实现。

\n

小智 8

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

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

$ lipo -create mylib.dylib -output mylib
Run Code Online (Sandbox Code Playgroud)

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

我遇到了另一个问题,我使用的另一个框架正在引用我原来的 .dylib,它已经消失,现在位于框架内。为了解决这个问题,我使用“install_name_tool”来修改其他框架以查找我的新框架。

$ cd OtherLib.framework 
$ install_name_tool -change @rpath/mylib.dylib @rpath/mylib.framework/mylib OtherLib
Run Code Online (Sandbox Code Playgroud)

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