如何正确嵌入第三方.dylib文件在iOS应用程序项目的应用程序商店发布?

fquxozlt  于 2022-11-26  发布在  iOS
关注(0)|答案(4)|浏览(1604)

我正在使用支持H264的PJSIP库构建一个iOS应用程序。构建H264时,我得到了1个.a文件和2个.dylib文件。我尝试在项目中使用. dylib,方法是添加为“嵌入式库”,还创建了一个单独的框架,然后将其添加到“嵌入式库”。但在将构建版本上传到App Store时,我收到错误“ERROR ITMS-90206:..."、“ERROR ITMS-90171:..."。所有这些都指向在项目中使用外部动态库。我遵循 www.example.com
但他们要求按照“添加框架目标”中的步骤操作。我想不出如何创建一个只有2个.dylib文件而没有其他源代码或头文件的框架。请展示将.dylib文件嵌入iOS应用程序以供应用程序商店提交的步骤。

hfsqlsce

hfsqlsce1#

我能够通过首先创建一个框架来提交一个带有.dylib的应用程序。我尝试了苹果文档中描述的方法,但在提交到商店时遇到错误(“无效的bundle.在xyz.framework的bundle包含不允许的文件”Frameworks“)
我使用lipo工具将我的.dylib手动打包到一个框架中。

$ lipo -create mylib.dylib -output mylib

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

x0fgdtte

x0fgdtte2#

您必须像框架一样直接将所有共享库(.dylib文件)添加并嵌入到顶层应用程序中。您不能将dylib放在框架中,因为Apple强烈建议不要使用此类框架(称为Umbrella frameworks),并且不接受带有此类框架的应用程序到AppStore(这是错误ITMS-90171的原因)。
正如Apple文稿所述:
伞式框架是包含其他框架的框架包。虽然可以为macOS应用创建伞式框架,但对大多数开发者来说没有必要,也不建议这样做。iOS、watchOS或tvOS不支持伞式框架。

icomxhvb

icomxhvb3#

没有足够的声誉来评论,但莫蒂的回答对我有用。
最后,我为构建后阶段编写了一个shell脚本来自动执行此操作。

有关rpath的有用提示:

如果您是从源代码构建.dylib文件,则可以将项目设置中的rpath值更改为 MyFramework.framework/MyFramework 可执行文件,该文件将由lipo工具打包到该文件中。
这将为您节省额外的生成后步骤

fafcakar

fafcakar4#

没有足够的声誉来评论,但我遇到了这个问题,Morty的回答帮助了我很多。为了不犯错误,你可以创建一个框架项目,编译一次,然后你可以按照Morty的回答。发出lipo命令,将生成的二进制文件复制到framework目录的根目录中,然后打开framework目录所在的终端并发出install_name_工具命令如下:* * 安装名称工具-id@rpath/框架目录/二进制名称框架目录/二进制名称**
使用上面的方法,我们可以向应用程序商店提交一个包含框架的应用程序,并被接受。

相关问题