仅在Testflight上崩溃

15

我们正在使用TestFlight发送我们的应用程序的试飞版。

应用程序中有一部分会崩溃,我们很难复现这个崩溃。代码相当简单。

事实证明,通过TestFlight获得应用程序的用户会遇到崩溃问题,而如果您使用IDE构建应用程序并安装它,则不会崩溃!

有人知道可能是什么原因导致这个问题吗?

是否有任何解决方法?我们不想停止使用TestFlight。


测试飞行支持区域有没有相关信息? - Jessedc
有趣的是,在我们的测试飞行试点部署中从未遇到过这个问题。您的代码中是否使用了任何 TestFlight API,例如检查点或其他内容? - NDY
3
请在计算机上以“发布模式(Release mode)”构建您的应用程序,而不是“调试模式(Debug)”。这可能只在发布模式下导致崩溃。 - Ben Trengrove
@Ben 就是这个!如果您回答得正确,我会将其标记为正确 - 谢谢。 - daihovey
3个回答

12

确保应用程序是在发布模式下而不是调试模式下构建的。应用程序只有在发布模式下才会崩溃。


这有助于使用我的设备而不是TestFlight,但如何修复它? - Dude
在我的情况下,我意识到Pods没有与Testflight构建关联。 - undefined
@Ben 我没明白你的意思,如果应用程序只在发布时崩溃,那为什么要在发布时构建呢? - undefined

5
我会尝试将崩溃堆栈跟踪映射到应用程序中的函数名称。这可能会为崩溃的性质提供有用的见解:
  1. 在报告崩溃时立即请求崩溃日志。这可以通过Xcode的组织者获得,如果无法使用,则可以从iPhone的“设置” ->“常规” ->“关于本机” ->“诊断与用量” ->“诊断与用量数据”中进行屏幕截图。滚动到应用程序名称或最新崩溃-应用程序名称.plist部分。
  2. 虽然理论上可以符号化崩溃,但我发现下面描述的过程是从堆栈获取符号的一种可靠方法。将崩溃线程的所有堆栈地址转换为方法名称。
  3. 可选地请求iDevice系统日志。这可能包括断言失败消息,这也是非常宝贵的。请注意,应尽快执行此操作,因为系统日志只保留有限数量的条目,然后会被删除。您可以使用组织者或cmd行idevicesyslog来获取此信息。

手动符号化: 只要构建具有调试信息,就可以使用此方法。

  1. 获取完全相同的.ipa文件,发生崩溃。如果您没有保存它,则可以使用iFunBox或cmd行ideviceinstaller实用程序从设备下载它。
  2. 解压缩.ipa
  3. 在可执行文件(Payload/AppName.app/AppName)上运行以下命令:

    otool -tv AppName.app | c++filt > listing.asm

  4. 等待上一步完成(可能需要一段时间)。生成的listing.asm文件将有几兆字节长。

  5. 使用可以处理大文件的编辑器,在listing.asm中搜索堆栈跟踪中列出的地址。请注意,地址可能会偏离几个字节(通常指向前3个字节左右)。而且,在listing.asm中找不到的地址表示iOS库中的地址。暂时忽略那些。

当然,如果您能够符号化,那么可以跳过此过程。

祝你调试好运!


嘿,是的,我们已经通过Testflight进行符号化了 - 正在上传dSYM。 - daihovey
崩溃线程的符号化堆栈跟踪显示了什么?那是非常重要的信息。 - Blanka

0
我们曾经遇到过类似的问题。问题出在静态库上。当我们从头开始构建应用程序并进行测试时,它会在测试中崩溃,但是在IDE中则不会。崩溃是因为在构建时未包括静态库,但在连接iPad直接使用XCode安装时已包含。
一个简单的测试可以证明这一点:
1.)不要从IDE构建,创建一个.app文件,然后通过iTunes加载它并检查是否会出现崩溃。
我们通过手动创建.iPA解决了这个问题,即先创建.app文件,然后创建一个Payload文件夹,将.app文件和info.plist文件放入其中。
然后,Testflight也开始正常工作了。

你是否使用了自动化构建脚本?我认为我遇到了类似的问题。 - alemangui
不,我们没有使用自动化构建脚本。这个错误对我们来说也很奇怪,但是在我们为所有的测试飞行构建使用静态库的解决方法之后,我们成功地解决了这个问题。 - VikrantY

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