由于我无法重现的启动崩溃,通用 iPad 应用程序被拒绝

Posted

技术标签:

【中文标题】由于我无法重现的启动崩溃,通用 iPad 应用程序被拒绝【英文标题】:Universal iPad App rejected because of launch crash that I can't reproduce 【发布时间】:2011-02-15 17:39:26 【问题描述】:

我对这个问题感到非常沮丧。等待一周后,我的通用 iPad 应用程序被拒绝,因为“在运行 iPhone OS 3.2 和 iPhone 3GS 运行 iPhone OS 3.1.3 和 Mac OS X 10.6.2 的 iPad 上启动时崩溃。”

很遗憾,我无法重现该问题,我已经在调试和发布模式下进行了测试,并且该应用运行良好。我什至创建了一个临时配置并在其他设备上进行了测试,一切正常。

我应该澄清一下,这是对当前 iPhone 应用程序的更新,并且我使用与原始 iPhone 应用程序相同的分发配置文件。另外,在构建通用应用程序之前,我检查了所有内容:

http://iphonedevelopment.blogspot.com/2010/04/converting-iphone-apps-to-universal.html

以下是 Apple 发送给我的崩溃日志:

事件标识符:3E0D4A3B-2896-444D-BCBE-6C0CA1A66A90 CrashReporter 密钥:18b5124ea5f657227c5f202a27ed707379b3e2e7 过程:转移[982] 路径:/var/mobile/Applications/E9062465-7EA6-424C-9C61-D9DBCC7C915A/Transfer.app/Transfer 标识符:转移 版本: ??? (???) 代码类型:ARM(本机) 父进程:launchd [1] 日期/时间:2010-05-04 15:35:57.399 -0700 操作系统版本:iPhone OS 3.1.3 (7E18) 报告版本:104 异常类型:EXC_BAD_INSTRUCTION (SIGILL) 异常代码:0x00000001、0x3eaa2188 突出显示的线程:0 回溯不可用 未知线程因 ARM 线程状态而崩溃: r0:0x00002f90 r1:0x00000000 r2:0x385242d8 r3:0x0000010d r4:0x00000000 r5:0x00000000 r6:0x00000000 r7:0x00000000 r8: 0x2ffffba0 r9: 0x2ffff90 r10: 0x00000000 r11: 0x00000000 ip: 0x0000000c sp: 0x2ffffba4 lr: 0x2fe08727 pc: 0x00002f94 cpsr: 0x40000010 二进制图像: 0x1000 - 0x25fff +Transfer armv7 /var/mobile/Applications/E9062465-7EA6-424C-9C61-D9DBCC7C915A/Transfer.app/Transfer 0x2fe00000 - 0x2fe24fff dyld armv7 /usr/lib/dyld ……

还有一款适用于 iPad 的:

事件标识符:3B170A28-C8E2-4018-8166-E69432A65070 CrashReporter 密钥:4a0194e3f60559127faef2b014df605e4c47b981 硬件型号:iPad1,1 过程:转移 [533] 路径:/var/mobile/Applications/400EE394-7BEE-45CA-942D-DBDC106360FF/Transfer.app/Transfer 标识符:转移 版本: ??? (???) 代码类型:ARM(本机) 父进程:launchd [1] 日期/时间:2010-05-04 15:37:17.505 -0700 操作系统版本:iPhone OS 3.2 (7B367) 报告版本:104 异常类型:00000020 异常代码:0x8badf00d 突出显示的线程:0 应用特定信息: com.erclab.iphone.photodownload 未能及时启动 经过的总 CPU 时间(秒):1.150(用户 0.560,系统 0.590),6% CPU 已用应用程序 CPU 时间(秒):0.150,1% CPU 线程 0: 0 libobjc.A.dylib 0x33561996 0x33560000 + 6550 1 libobjc.A.dylib 0x33564986 0x33560000 + 18822 2 libobjc.A.dylib 0x33564cb2 0x33560000 + 19634 ...

除了在应用启动后将本地 HTML 加载到 Web 视图中之外,该应用不执行任何操作,所以我不明白为什么它会显示“未能及时启动”

任何帮助将不胜感激。

【问题讨论】:

我应该补充一点,在这次更新中,最初的 iPhone 应用程序几乎没有被触及。此更新的目的是添加 iPad 版本并将其作为通用应用程序分发。我这样做的方法是启动一个新的 Xcode 项目选择通用应用程序,然后将代码从原始 iPhone 应用程序复制到新项目。 我在这里截取了我的所有构建设置的屏幕截图:echamussy.posterous.com/build-settings您发现它们有什么问题吗? 【参考方案1】:

哇!!!!现在,这非常非常令人沮丧。经过数小时甚至数天的调试、查看我的代码、在不同场景下进行测试、提出问题和 2 次拒绝后,Apple 今天(在我第一次提交后 18 天)给我写了一封电子邮件:

“...这是提交过程的问题,而不是您的代码的问题。iPhone OS Engineering 正在调查此问题......”

你可以想象我现在的感受。感谢所有帮助我解决这个“崩溃”的人。

【讨论】:

你做了什么来解决这个问题? 嗨,克里斯,我不需要对我的代码做任何事情。在我的应用程序因崩溃而被拒绝几次后,我联系了 Apple 开发人员技术支持,一周后他们告诉我我的应用程序一切正常,这是 App Store 审核流程的问题。然后,我将我从技术支持收到的电子邮件转发到应用审查电子邮件,几天后我的应用获得了批准。整个过程花了大约 3 周的时间,但最终我得到了应用程序的批准,而无需更改我的代码。【参考方案2】:

您是否尝试从 applicationDidFinishLaunching 加载 Web 视图?您确定测试仪可以连接到您的服务器吗?

崩溃根本不是崩溃,而是系统因为启动时间过长而强制您的应用退出。将所有你能做的事情从 applicationDidFinishLaunching 中移出,这样它就可以完成,好吧,启动。

【讨论】:

我正在加载的网页是本地资源,不涉及网络服务器。在 applicationDidFinishLaunching 我正在检查一些用户偏好并添加一些通知观察者,就是这样。如果该应用程序仅在我构建它以进行分发时才真正挂在那里,我会感到非常惊讶,因为当我在调试和临时模式下测试时它实际上会立即启动。还有其他建议吗?非常感谢您的帮助! 第二次崩溃不是崩溃。第一个是非法指令导致的,所以是crash。 由于第一个没有回溯,我猜它是同一种崩溃(应用程序提前终止),即使它的日志记录似乎不同。 @Enrique:也许你的笔尖加载了非常大的图像?我认为笔尖加载阶段也可能计入启动时间...... 笔尖非常简单,它们有一个 UIWebView 用于显示本地网页。真正奇怪的是应用程序的iPhone部分几乎没有被触及,这次更新是添加应用程序的iPad版本但iPhone应用程序委托是相同的,所以我会理解iPad应用程序是否有问题但是为什么 iPhone 应用程序在以前没有作为独立应用程序时也会崩溃。再次感谢您的意见。【参考方案3】:

如果您正在加载网页,当您禁用所有网络(飞行模式)并启动时会发生什么?这是他们运行的标准测试之一,所以你也应该这样做。

【讨论】:

我尝试通过进入飞行模式来禁用所有网络,并且该应用程序在 iPad 和 iPhone 上都能正常运行。奇怪的是,我正在加载一个本地网页(html 文件和所有图像都存储在应用程序中),因此读取这些文件不需要很长时间。当我在调试或发布模式下运行应用程序时,应用程序会立即启动 - 没有任何延迟 :( 我根据您的描述假设了一个托管页面。正如您所说,禁用网络不应该对本地页面产生任何影响。【参考方案4】:

我会尝试模拟内存不足的情况,看看我们的应用如何处理它。

编辑: 看看这个答案iPhone Development Simulate Memory Warning

【讨论】:

我该怎么做?模拟器或设备可以吗? 更新了我的回答,喜欢另一个关于模拟内存警告的问题。 谢谢。问题是,根据 Apple 的说法,应用程序甚至没有启动,因此在模拟器中启动应用程序后模拟内存警告可能不会告诉我太多,因为他们报告的问题发生在应用程序启动时。【参考方案5】:

你说你复制了你的代码。您是否还复制了本地资源?即你的html文件?你确定它不只是链接吗?它是否包含在构建中?如果文件只是链接到捆绑包中,它可能会解释为什么它会为您启动而不是为他们启动。将来(也许您想尝试一下,看看它是否对您有更好的效果)将您的应用程序升级到通用应用程序的正确方法是使用 Xcode 文件选项 Upgrade for iPad(或类似的东西)它将为您完成所有必要的工作以使其与 iPad 兼容。一步一步在苹果的网站上,只需谷歌搜索如何创建通用应用程序。

【讨论】:

是的。我复制了所有本地资源,并确保在执行此操作时选中了“复制”复选框。此外,我能够构建和运行该应用程序以进行临时分发,并且我已经使用 2 部不同的 iPhone 对其进行了测试,没有任何问题,该应用程序几乎立即启动。【参考方案6】:

只需再次向 Apple 提交相同的应用程序,无需任何更改。其他人会审查它,他们会批准它。相信我,我以前做过。苹果审批团队简直是疯了。 在设备上,应用程序由于内存问题而崩溃。这是无法复制的东西。从您的故障转储中看起来是这样的。

【讨论】:

崩溃转储完全不像那样。它未能及时启动,而且可能每次都会发生 - 从根本上说,重新提交以“解决”系统的建议是非常糟糕的建议,因为如果一个测试人员看到你的崩溃,数百万人也会发现它,他们会生气的。 听起来 OP 采纳了你的建议。

以上是关于由于我无法重现的启动崩溃,通用 iPad 应用程序被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

由于无法重现的崩溃,Apple 拒绝了应用程序

由于不可重现的错误,使用 Flutter 制作的 iOS 应用程序被拒绝

iOS 崩溃:无法在 Path 中打开领域

调解中心崩溃报告中的错误执行顺序

应用审查小组的 EXC_BREAKPOINT (SIGTRAP)。不可重现

UITableView willDisplayCell崩溃