将一个.dylib文件嵌入到iOS框架中

7
我一直在尝试提交一个包含 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 未位于预期位置 /Payload//Frameworks。将文件移动到预期位置,使用当前公共 (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中可以看到错误信息:“可能表明您的应用程序嵌入了一个未打包成框架的动态库。在iOS、watchOS或tvOS上不支持框架束之外的动态库,这些库通常具有文件扩展名.dlylib,除了由Xcode提供的系统Swift库。
因此,下一步是将动态库(作为子项目)嵌入Cocoa Touch Framework项目中。虽然框架构建良好,但我卡在导入dylib类时出现“找不到符号”的错误。
我想知道实现此项目结构所需的步骤,或者在iOS上是否可能。

1
请确保应用程序项目具有动态库依赖项。我认为您可以在XCode中检查链接命令,它应该包含--framework YouFramework。 - smaryus
这方面有任何更新吗?我目前遇到了将dylib转换为framework的相同问题。 在xcode的Cocoa Touch Framework项目中,已经将dylib链接(在链接库和框架部分),但是当我检查构建的Framework的最终大小时,它仅有50KB,而dylib大约为4MB。 - peco
1个回答

8

我成功地提交了一个带有 .dylib 的应用,方法是先创建一个框架。 我首先尝试了苹果文档中描述的方法,但在提交到商店时出现错误( "invalid bundle. the bundle at xyz.framework contains disallowed file 'Frameworks' )

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

$ lipo -create mylib.dylib -output mylib

现在你已经获得了名为'mylib'的二进制文件 创建一个名为mylib.framework的文件夹,然后将二进制文件放入其中。 接下来添加一个Info.plist文件(可以复制并修改现有框架中的一个)。在Info.plist文件中,填写您框架的字段。主要更新或添加的是“可执行文件”,应该是那个二进制文件的名称。
我曾经遇到另一个问题,即我正在使用的另一个框架引用了我的原始.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


如果我们有两个dylib文件,一个用于模拟器,另一个用于真实设备,我们该如何将这两个dylib合并为一个框架?并且Xcode将在dylib文件之间进行切换。 - Hassan Taleb
@HassanTaleb 我认为这就是XCFramework所做的。 - Adamski
@Adamski 是的,但是当使用 XCFramework 时,苹果会拒绝构建,并显示以下错误:ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. 请使用当前公共(GM)版本的 Xcode 重新构建您的应用程序并重新提交。 - Hassan Taleb
创建框架并使用后,在Xcode控制台中出现以下错误消息:Library not loaded: '@rpath/mylib.dylib' Referenced from: '/private/var/containers/Bundle/Application/…/TestProject.app/TestProject' Reason: tried: '/usr/lib/system/introspection/mylib.dylib' (no such file)我们该如何解决? - Hassan Taleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接