如何在 App Store 发布的 iOS 应用项目中正确嵌入 3rd 方 .dylib 文件?

Rou*_*nak 5 objective-c dylib ios openh264 xcode9

我正在使用支持 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 提交的步骤。

小智 7

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

我使用 lipo 工具手动将我的 .dylib 打包到框架中。

$ lipo -create mylib.dylib -output mylib
Run Code Online (Sandbox Code Playgroud)

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

我遇到了另一个问题,我使用的另一个框架正在引用我原来的 .dylib,它已经消失,现在位于框架内。为了解决这个问题,我使用“install_name_tool”来修改其他框架以查找我的新框架。

$ cd OtherLib.framework 
$ install_name_tool -change @rpath/mylib.dylib @rpath/mylib.framework/mylib OtherLib
Run Code Online (Sandbox Code Playgroud)

您可以在这篇优秀的博客文章中阅读有关该工具以及修改库中的各种路径的更多信息: https://medium.com/@donblas/fun-with-rpath-otool-and-install-name-tool-e3e41ae86172


Ale*_*kov 2

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

正如苹果文档所说:

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

  • 您好,如果我将 .dylibs 放入 My.App/Frameworks 文件夹中,Apple 会拒绝它,因为“无效的 Swift 支持 - 缺少 SwiftSupport 文件夹”。使用当前公共 (GM) 版本的 Xcode 重建您的应用程序并重新提交。`您能否让我知道 iOS 应用程序是否可以包含 .dylib 文件或者它们需要转换为框架? (2认同)