在 iOS 框架中嵌入 .dylib

问题描述 投票:0回答:1

我一直在尝试提交带有 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,然后重新提交

来自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 上不受支持(系统 Swift 库除外)。由 Xcode 提供。

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

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

ios swift xcode frameworks dynamic-library
1个回答
7
投票

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

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

$ lipo -create mylib.dylib -output mylib

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

您可能还需要更新框架本身的名称。 您可以使用otool查看当前名称:

$ otool -L mylib.framework/mylib            

mylib.framework/mylib (architecture arm64):
    @executable_path/Frameworks/mylib.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.12)
    ... 

然后将其重命名为.framework位置:

$ install_name_tool -id @rpath/mylib.framework/mylib mylib.framework/mylib

现在 otool 应该显示更新的路径:

$ otool -L mylib.framework/mylib                                                  
mylib.framework/mylib (architecture arm64):
    @rpath/mylib.framework/mylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.12)

我遇到了另一个问题,我使用的另一个框架正在引用我原来的 .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

© www.soinside.com 2019 - 2024. All rights reserved.