6

我正在使用支持 H264 的 PJSIP 库构建 iOS 应用程序。构建 H264 时,我得到 1 个 .a 文件和 2 个 .dylib 文件。我尝试通过添加为“嵌入式库”以及创建一个单独的框架然后将其添加到“嵌入式库”中来在我的项目中使用 .dylibs。但是在将构建上传到 App Store 时,我收到错误“ERROR ITMS-90206:...”、“ERROR ITMS-90171:..”。所有指向在项目中使用外部动态库。我关注了 https://developer.apple.com/library/content/technotes/tn2435/_index.html#//apple_ref/doc/uid/DTS40017543-CH1-TROUBLESHOOTING_BUNDLE_ERRORS-EMBEDDED__DYLIB_FILES

但他们要求遵循“添加框架目标”中的步骤。我不知道如何创建一个只有 2 个 .dylib 文件而没有其他源代码或头文件的框架。请展示将 .dylib 文件嵌入 iOS 应用程序以供 App Store 提交的步骤。

4

3 回答 3

5

通过首先创建一个框架,我能够提交一个带有 .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

于 2020-07-17T22:39:46.323 回答
2

您必须以与框架相同的方式将所有共享库(.dylib 文件)直接添加和嵌入到顶层应用程序中。您不能将 dylibs 放入框架中,因为 Apple 强烈建议不要使用此类框架(称为Umbrella 框架)并且不接受具有此类框架的应用程序到 AppStore(这是错误 ITMS-90171 的原因)。

正如苹果文档所说:

伞形框架是包含其他框架的框架包。虽然可以为 macOS 应用程序创建伞式框架,但对于大多数开发人员来说,这样做是不必要的,因此不建议这样做。iOS、watchOS 或 tvOS 不支持 Umbrella 框架。

于 2018-05-06T11:07:25.840 回答
0

没有足够的声誉发表评论,但莫蒂的回答对我有用。

我最终为构建后阶段编写了一个 shell 脚本来自动执行此操作。

rpath 的有用提示:

如果您从源代码构建 .dylib 文件,您可以将项目设置中的 rpath 值更改为MyFramework.framework/MyFramework可执行文件,它将由 lipo 工具打包到其中。

这将为您节省额外的构建后步骤

于 2022-01-21T02:39:45.930 回答