1、以前上架的 App 在 iOS 9 会闪退问题(iOS系统版本更新,未配置新版本致使闪退问题)html
最新更新:(2015.10.02)ios
开发环境:数据库
真机测试(如下机种皆不闪退):api
※ 使用上面的配置,及 EMB 官方提供的 Hotfix,真机皆没有问题,下面的闪退问题能够略过了。数据结构
问题一:iOS 9 于 2015/09/16 开放下载了,但以前使用 Delphi(XE8 或以前的版) 开发上架的 App 皆会闪退,没法运行在 iOS 9。app
问题二:使用 Delphi 10 Seattle + Xcode 7.0 + iOS SDK 9.0 发布到 iOS 9 的真机没有问题,但发布到 iOS 6~8 的机子会闪退。函数
为了解决以上问题,能够参考下列方法:post
开发环境:测试
真机测试(如下机种皆不闪退):ui
开发环境:
修改源码:
真机测试(如下机种皆不闪退):
赶快从新上架新版 App 吧。
追加整理,依版本整理以下(2015.09.23):
官方 QC 讨论:
https://quality.embarcadero.com/browse/RSP-12324
官方 Apple Xcode 各版本下載位置:
https://developer.apple.com/downloads/
秒退是发生在程序刚刚启动的时候,在开发、苹果审核阶段都没有被发现的最大可能性就是,这个问题只会发生在老版系统、老版机型上。
对于不少开发者(尤为是我的开发者),进行全部 iOS 版本,全部 iOS 机型覆盖测试是有难度的,苹果审核时也只是重点审核该应用在新机器、新版本下的运行状况,并不关注老系统。因此这也就是为何会秒退的程序居然也能经过苹果的审核。
归纳:老机型,或者老系统版本的代码适配存在问题致使闪退。(不少公司提供测试组一套 测试机 的缘由,是为了解决 用户 体验 问题。防止用户 流失。用户不满)
在新 iOS 上正常的应用,到了老版本 iOS 上秒退最多见缘由是系统动态连接库或Framework没法找到。这种状况一般是因为 App 引用了一个新版操做系统里的动态库(或者某动态库的新版本)或只有新 iOS 支持的 Framework,而又没有对老系统进行测试,因而当 App 运行在老系统上时便因为找不到而秒退。解决办法是等开发人员发现这个问题后升级程序,或由用户自行升级其操做系统。
归纳:苹果官方审查力度加大,致使代码或者数据库更新,或者项目中使用的第三方代码已经不适合 当前 的苹果官方 的审查门槛。
还有一种常见的秒退是程序在升级时,修改了本地存储的数据结构,可是对用户既存的旧数据没有作好升级,结果致使初始化时由于没法正确读取用户数据而秒退。这类问题一般只需删除程序后从新安装一遍就能解决。但缺点是用户的既存数据会丢失——就算有备份可能也无济于事,由于备份下来的旧数据仍是没法被正确升级。若是旧数据很是重要,那么就须要联系开发人员要求其进行程序修正了。
归纳:系统升级,数据丢失致使
另外一种已经变得不那么常见的秒退缘由是 App 的设置不正确。例如在编译时没有编译 ARMv6 的版本,可是设置里却容许该 App 运行在 ARMv6 处理器的机器上(如:iPhone 1代,iPhone 3G,iPod touch 一、2代和3代8G版)。这个问题除了等开发人员升级外用户本身没什么办法解决。固然愿意换台新机器是最好的 ;) 这个问题目前已经可以在提交应用至 App Store 的时候被检查出来了,所以从此应该不太常见了。
归纳:App设置错误
还有一类秒退或是用到 App 里某个功能后必退的缘由,是开发时用到了只有新版操做系统才支持的某个方法,而又没有对该方法是否存在于老系统中作出判断。例如程序启动时用到了 Game Center,而没有判断用户的机器是否支持 Game Center,因而就秒退了。
归纳:iOS版本升级致使问题
主要的秒退状况就是这么几个,这些都是以该 App 新版系统上能正常跑为前提的。
诸如内存不足、BAD_ACCESS 这类问题一般无论在新旧 iOS 上都会存在,若是是因为这类问题形成的秒退一般都能在测试和审核阶段被发现,所以并不常见。
归纳:内存不足致使闪退,几本上在苹果移动端 是暂时不可能出现的
三.程序崩溃会致使闪退。
常见程序崩溃缘由:
1.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。没数据会崩溃,数据错误会崩溃。
2.点击某个模块或者某个功能按钮,进行页面跳转,或者获取数据。业务逻辑处理不当会致使崩溃。
3.点击某个模块或者某个功能按钮,直接致使崩溃:编辑代码时无报错,编译时出错。代码逻辑错误,或者存在闪退符号的代码。
常见程序崩溃缘由的获取:
iOS开发中遇到程序崩溃是很正常的事情,如何在程序崩溃时捕获到异常信息并通知开发者?
下面就介绍如何在iOS中实现:
1. 在程序启动时加上一个异常捕获监听,用来处理程序崩溃时的回调动做
1
|
NSSetUncaughtExceptionHandler
(&UncaughtExceptionHandler);
|
官方文档介绍:Sets the top-level error-handling function where you can perform last-minute logging before the program terminates.
UncaughtExceptionHandler是一个函数指针,该函数须要咱们实现,能够取本身想要的名字。当程序发生异常崩溃时,该函数会获得调用,这跟C,C++中的回调函数的概念是同样的。
2. 实现本身的处理函数
1
2
3
4
5
6
7
|
void
UncaughtExceptionHandler(
NSException
*exception) {
NSArray
*arr = [exception callStackSymbols];
//获得当前调用栈信息
NSString
*reason = [exception reason];
//很是重要,就是崩溃的缘由
NSString
*name = [exception name];
//异常类型
NSLog
(@
"exception type : %@ \n crash reason : %@ \n call stack info : %@"
, name, reason, arr);
}
|
以上代码很简单,可是带来的做用是很是大的。
程序崩溃日志分析一: http://www.cnblogs.com/CoderAlex/p/4860075.html
程序崩溃日志分析二:http://www.cnblogs.com/CoderAlex/p/4860075.html