我一直在尝试提交带有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上也可以。
答案 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