Mac 应用程序在启动时崩溃,链接框架未捆绑

Posted

技术标签:

【中文标题】Mac 应用程序在启动时崩溃,链接框架未捆绑【英文标题】:Mac app crashes on launch, linked framework not bundled 【发布时间】:2012-10-08 06:49:49 【问题描述】:

(编辑:我能够捆绑框架,但它仍然不会采用更改后的安装目录。因此,下面的问题已更改为“未找到链接和捆绑的框架图像”)

Mac 应用程序已提交给 MAS,但被 Apple 拒绝,原因非常合理:链接的框架未捆绑。

我只是询问如何确保它正确包含在捆绑包中,并在再次提交之前在我的 Mac 上确认。

请让我知道您需要我提供什么/任何额外信息。

编辑:按照 subzero 的说明获取更多信息。

当进行 Product > Build 时,.app 文件最终位于我机器上的 Documents/build/Release 中。

这是我的构建阶段的样子 - https://dl.dropbox.com/u/19155207/copyframeworks.jpg

并且 UIKit.Framework 文件夹 位于 WinKonto.app/Contents/Frameworks 内,其中包含:https://dl.dropbox.com/u/19155207/frameworksfolder.jpg

如果我从 Releases 文件夹运行它,它仍然会给出相同的错误。只有当我从 XCode 运行它时它才能工作。你能看出哪里不对劲吗?

编辑 2:我已将框架文件 (UIKit) 放入包中。

这是崩溃报告错误消息:

Dyld 错误消息:库未加载: Frameworks/UIKit.framework/Versions/A/UIKit 引用自: /Users/henrikerlandsson/Documents/build/Release/WinKonto.app/Contents/MacOS/WinKonto 原因:找不到图片

但是framework在bundle里面,在加入项目之前被install_name_tool修改了。

我不知道为什么那个修改不起作用,但是我把它变成了一个私有框架并改为在那里更改了安装目录,它起作用了(见我的回答)。

【问题讨论】:

【参考方案1】:

在 XCode 中,

    将 Copy Files 构建阶段添加到应用程序的目标 将其移至 Link 阶段上方,将其目标设置为 myApp.app/Contents/Frameworks 并将框架添加到其中。

【讨论】:

感谢您的快速回答:) 但是...在链接框架阶段之后,我确实有一个复制框架阶段(包含相关框架)。您的意思是我还必须将其作为文件复制到捆绑包中吗?另外,我希望在提交之前正确包含一些测试方法。我的意思是,不必再等两周。 好吧...在您使用复制文件阶段将文件复制到捆绑包上的 Frameworks 文件夹之后... xcode 将复制以及将您的应用程序链接到该捆绑包。现在进行测试 - 制作一个安装了 vanilla mac os 的 vm...复制你的包并运行它...如果它运行那么你应该没有问题 我没有在 Copy Files 阶段执行此操作,而是在另一个似乎用于复制框架的阶段,即 Copy Frameworks 阶段。该阶段是否将框架复制到包之外的其他地方?我以前也没有手动处理过 Mac 包,所以我真的不知道如何找到它并将其复制到另一个人的机器上。某处是否有 .app 文件? 您使用的是哪个版本的 xcode?在我拥有的 4.5 中...您没有任何专门用于复制框架的构建阶段...您是说以“框架”为目标的复制文件构建阶段...可以正常工作...至于构建 .app 包,它将位于 xcode(Preferences>Locations) 中设置的派生数据文件夹中...默认情况下 ~/Library/Developer/Xcode/DerivedData 所以你应该查看 ~/Library/Developer/Xcode/DerivedData/ /Build/Products 用于 .app 文件 当进行产品 > 构建时,.app 文件最终会出现在我机器上的 Documents/build/Release 中。这是我的构建阶段的外观 - dl.dropbox.com/u/19155207/copyframeworks.jpg 和 UIKit.Framework folder 位于 WinKonto.app/Contents/Frameworks 中,其中包含:dl.dropbox.com/u/19155207/frameworksfolder.jpg 如果我复制粘贴它仍然会给出相同的错误我 Mac 硬盘上其他地方的应用程序。你能看出这里有什么不对吗?【参考方案2】:

我把它做成了一个私有框架。我按照Embedding a Private Framework in Your Application Bundle 下的说明进行操作,这让我可以将框架的安装目录正确设置到它出现在包中的位置。

【讨论】:

以上是关于Mac 应用程序在启动时崩溃,链接框架未捆绑的主要内容,如果未能解决你的问题,请参考以下文章

Scringo 框架应用程序在 ios 中崩溃?

如何在捆绑电子应用程序之前对其进行编码(对于Mac)?

在 10.6 上测试 Mac OS X 10.7 特定代码时出现“未找到符号”崩溃

捆绑框架与XCode中的应用程序

如何在 ios 设备上未启动本机应用程序时进行调试

Fabric Answer 在从 Xcode 10 和 iOS 12 开始时崩溃 iOS 应用程序