首页 > 解决方案 > 在 iOS 框架中嵌入 .dylib

问题描述

我一直在尝试提交一个带有 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 //构架。将文件移动到预期位置,使用当前公共 (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 文档中,错误“可能表明您的应用是嵌入未打包为框架的动态库. 除了 Xcode 提供的系统 Swift 库外,iOS、watchOS 或 tvOS 不支持框架包之外的动态库(通常具有文件扩展名 .dylib)。 "

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

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

标签: iosswiftxcodeframeworksdynamic-library

解决方案


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


推荐阅读