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

11

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

不幸的是,我无法复制此问题,我已在调试和发布模式下进行了测试,应用程序可以正常工作。我甚至创建了一个 ad-hoc 配置并在其他设备上测试它,一切都很正常。

需要澄清的是,这是针对当前iPhone应用程序的更新,我正在使用与原始iPhone应用程序相同的分发配置文件。同时,在构建通用应用程序之前,我已经检查了所有内容,遵循了这篇文章中的指南:

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

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

Incident Identifier: 3E0D4A3B-2896-444D-BCBE-6C0CA1A66A90
CrashReporter Key:   18b5124ea5f657227c5f202a27ed707379b3e2e7
Process:         Transfer [982]
Path:            /var/mobile/Applications/E9062465-7EA6-424C-9C61-D9DBCC7C915A/Transfer.app/Transfer
Identifier:      Transfer
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]
Date/Time: 2010年05月04日15:35:57.399 -0700 OS版本: 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: 0x2fffef90, 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的Incident标识符为3B170A28-C8E2-4018-8166-E69432A65070,CrashReporter密钥为4a0194e3f60559127faef2b014df605e4c47b981。硬件型号为iPad1,1,进程为Transfer [533],路径为/var/mobile/Applications/400EE394-7BEE-45CA-942D-DBDC106360FF/Transfer.app/Transfer,标识符为Transfer,版本为??? (???),代码类型为ARM (Native),父进程为launchd [1]。日期/时间为2010年5月4日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应用程序的代码复制到新项目中。 - Enrique R.
我在这里截了一张所有构建设置的屏幕截图:http://echamussy.posterous.com/build-settings你看到有什么可能出错的地方吗? - Enrique R.
6个回答

20

哇!!!现在这真的非常非常令人沮丧。经过数小时甚至数天的调试、查看我的代码、在不同的场景下测试、提问并经历了两次拒绝之后,苹果今天给我写了一封电子邮件(在我首次提交的18天后):

"......这是一个与提交过程有关而不是与您的代码有关的问题。iPhone操作系统工程正在调查这个问题......"

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


你是如何解决这个问题的? - cvb
1
嗨,克里斯, 我在我的代码上什么都没做。在我的应用程序因崩溃而被拒绝了几次之后,我联系了苹果开发技术支持,一周后他们告诉我我的应用程序没有问题,这是一个App Store审核过程的问题。然后,我将我从技术支持收到的电子邮件转发给了应用程序审查电子邮件,几天后我的应用程序得到了批准。整个过程大约花了3个星期,但最终我成功通过了应用程序审核,而不需要更改任何代码。 - Enrique R.

3

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

这个崩溃实际上不是真正的崩溃,而是系统强制退出应用程序,因为它启动时间太长了。 尽可能将所有内容移出applicationDidFinishLaunching,以便它可以顺利地启动。


我正在加载的网页是本地资源,没有涉及到Web服务器。在applicationDidFinishLaunching中,我正在检查一些用户偏好设置并添加一些通知观察者,就这样。如果应用程序仅在我构建它以进行分发时挂起,那么我会感到非常惊讶,因为在Debug和ad-hoc模式下测试时它实际上会立即启动。还有其他建议吗?非常感谢您的帮助! - Enrique R.
第二次崩溃并不是真正的崩溃。第一次崩溃是由于非法指令引起的,因此它才是真正的崩溃。 - JeremyP
由于第一个没有回溯,我猜测它是同一种崩溃(应用程序提前终止),尽管其日志记录似乎不同。 - Kendall Helmstetter Gelner
@Enrique:也许你的 nib 文件加载了非常大的图片?我认为 nib 文件加载阶段也会影响启动时间... - Kendall Helmstetter Gelner
这些nibs非常简单,它们有一个UIWebView用于显示本地网页。真正奇怪的是,iPhone应用程序部分几乎没有改动,此次更新是为了添加iPad版本的应用程序,但是iPhone应用程序委托是相同的,因此我会理解如果iPad应用程序出现问题,但为什么之前作为独立应用程序时iPhone应用程序没有崩溃,现在却也崩溃了呢?再次感谢您的意见。 - Enrique R.

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

我尝试通过进入飞行模式来禁用所有网络,这个应用程序在iPad和iPhone上都可以正常工作。奇怪的是,我正在加载一个本地网页(html文件和所有图像都存储在应用程序中),所以读取这些文件不应该需要很长时间。当我以调试或发布模式运行应用程序时,应用程序会立即启动 - 没有任何延迟 :( - Enrique R.
从您的描述中,我认为这是一个托管页面。正如您所说,禁用网络不应该对本地页面产生任何影响。 - drawnonward

0

我该怎么做?从模拟器或设备上是否可能实现? - Enrique R.
我已经更新了我的答案,并提供了一个关于模拟内存警告的问题链接。 - Sophtware
谢谢。问题是,根据苹果公司的说法,应用程序甚至不能启动,因此在模拟器中启动应用程序后模拟内存警告可能不会告诉我太多信息,因为他们报告的问题发生在应用程序启动时。 - Enrique R.

0

你说你复制了你的代码。你也复制了本地资源吗?例如你的HTML文件?你确定它不仅仅是链接进去的吗?它被包含在构建中了吗?如果该文件只是链接到捆绑包中,那么这可能解释了为什么它可以在你的电脑上运行,但对他们来说却不能。

将来(也许你想尝试一下,看看是否会更好),将应用程序升级为通用应用程序的正确方法是使用Xcode文件选项“升级为iPad”(或类似选项),它将为您执行所有必要的工作,使其兼容于iPad。详细步骤请参考苹果网站,只需搜索如何创建通用应用程序即可。


是的。我复制了所有本地资源,并确保在此过程中勾选了“复制”复选框。此外,我能够构建和运行用于特定用户分发的应用程序,并且已经在两个不同的iPhone上进行了测试,没有出现任何问题,应用程序几乎可以立即启动。 - Enrique R.

-2

只需将相同的应用程序再次提交给苹果,而不进行任何更改。其他人会审核它并批准它。相信我,我以前做过这件事。苹果的批准团队非常疯狂。 在设备上,应用程序由于内存问题而崩溃。这是无法再现的。从您的崩溃转储中看起来是这样。


8
这个崩溃转储完全不像那样。它无法及时启动,而且这种情况很可能每次都会发生。基本上,建议重新提交以“解决”系统问题的做法真的很糟糕,因为如果一个测试人员看到了你的崩溃,那么可能还会有成千上万的人也会遇到同样的问题,并感到非常生气。 - Kendall Helmstetter Gelner
听起来像是楼上的建议被采纳了。 - Peter K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接