应用程序在 iOS 9 中崩溃,但在 iOS 10 中没有

Posted

技术标签:

【中文标题】应用程序在 iOS 9 中崩溃,但在 iOS 10 中没有【英文标题】:App crash in iOS 9 but not in iOS 10 【发布时间】:2016-12-15 14:19:08 【问题描述】:

我有一个录制视频的应用程序,并使用外部库作为 FMMPEG 和 x264。所有外部库均使用 ios 9.2 SDK 编译并适用于所有有效架构。

在我决定使用 iOS 10 SDK 作为基础 SDK 并将 iOS 10 中已弃用的方法替换为使用 iOS 的较新方法(将 Xcode 更新到 8.X 版本之后)之前,它一直运行良好。目前我有这个构建设置:

Build Settings

正如我所说,该应用程序使用外部库,并且该库是使用 iOS 9.2 SDK 版本编译的(我决定这样做是为了避免警告,因为我的应用程序支持的最低版本是 9.2)。好吧,当应用程序在 iOS 10 中运行时,它运行时没有错误,但是当应用程序在 iOS 9 中运行并且我开始录制视频时,应用程序总是在 FFMPEG 库中的浮动操作中崩溃(如果我编辑 FFMPEG 源代码并投射浮动在操作之前将值设置为整数,应用程序在下一个浮点操作中崩溃,因此它不是解决方案)。

问题是:

只有当我在 Xcode 中使用 iOS 10.X SDK 版本编译应用程序时才会崩溃, 当我在 Xcode 中配置使用 iOS 9.X SDK 版本进行编译和 在 iOS 9 中安装应用程序,它不会崩溃。

解决方案可能是: 使用 iOS 9.X SDK 在 Xcode 中编译,但我不能使用 iOS 9.X SDK 版本来创建应用程序,我使用仅在 iOS 中的框架10 作为用户通知。

当然,我总是在运行时检查 iOS 版本:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) ...

摘要:

使用 iOS 10.X SDK + iOS 9 编译的应用 = 崩溃

使用 iOS 9.X SDK + iOS 9 编译的应用 = 无崩溃(但不能成为解决方案)


崩溃代码:

code=EXC_ARM_BREAKPOINT,subcode=0xe7ffdefe

【问题讨论】:

你检查过这个问题吗? ***.com/questions/29434253/… 在这种特殊情况下,它是一个整数,在 64 位环境中使用,但它在代码中的使用是 32 位的。只需转换为 UInt32 即可解决此问题。也许使用Float32 问题不是 32 位和 64 位,问题是:一台装有 iOS 10 的 iPhone SE 运行应用程序没有问题。其他带有 iOS 9 的 iPhone SE 在浮点操作中崩溃,iPhone SE 使用 64 位 proc,所以它不可能是错误。第三方库中的应用程序崩溃,更改所有类型是疯狂的。 已编辑解决方案。谢谢大家 ;) 【参考方案1】:

(代表 OP 发布)

问题解决了。当我检查日志时,我看到了下一个错误:

dyld: Symbol not found: ___gesf2 

问题在于,当应用以 32 位(armv7 和 armv7s)运行时,应用正在 AddressBook Framework 中搜索符号。解决方案是从项目中删除此框架并重新编译。

【讨论】:

以上是关于应用程序在 iOS 9 中崩溃,但在 iOS 10 中没有的主要内容,如果未能解决你的问题,请参考以下文章

具有自动调整大小的 UICollectionViewCell 在 iOS 9 中不起作用,但在 iOS 10 中起作用

Xcode 9.4 + 仅测试飞行应用程序崩溃

NSTimer - 适用于 iOS 10 但不适用于 iOS 9.3

在 iOS 10.1.1 上运行的 Xcode 9 应用程序在启动时崩溃

我的应用程序在 Xcode 10 正式版 Seed 上传的 iOS9.1 和 9.2 设备中崩溃

该应用程序在通过 Testflight 在 iOS 9.2.1 上启动几秒钟后崩溃