一、之前上架的 App 在 iOS 9 會閃退問題(iOS系統版本更新,未配置新版本導致閃退問題)
最新更新:(2015.10.02)
開發環境:
- Delphi 10 Seattle
- OS X El Capitan v10.11
- Xcode v7.0.1
- iOS SDK v9.0
真機測試(以下機種皆不閃退):
- iPhone 3GS v6.1.2 (32 bit)
- iPhone 4 v7.1.2 (32 bit)
- iPhone 4S v9.0 (32 bit)
- iPhone 5S v8.4.1 (64 bit)
- iPad 2 mini v9.0 (64 bit)
※ 使用上面的配置,及 EMB 官方提供的 Hotfix,真機皆沒有問題,下面的閃退問題可以略過了。
問題一:iOS 9 於 2015/09/16 開放下載了,但之前使用 Delphi(XE8 或之前的版) 開發上架的 App 皆會閃退,無法運行在 iOS 9。
問題二:使用 Delphi 10 Seattle + Xcode 7.0 + iOS SDK 9.0 發布到 iOS 9 的真機沒有問題,但發布到 iOS 6~8 的機子會閃退。
為了解決以上問題,可以參考下列方法:
1. 使用 Delphi 10 Seattle 重新上架:
開發環境:
- Delphi 10 Seattle
- Xcode 7.0
- iOS SDK 8.4(這個是關鍵,一定要用 SDK 8.4 才不會閃退)
真機測試(以下機種皆不閃退):
- iPhone 3GS v6.1.2 (32 bit)
- iPhone 4 v7.1.2 (32 bit)
- iPhone 4S v9.0 (32 bit)
- iPhone 5S v8.4.1 (64 bit)
- iPad 2 mini v9.0 (64 bit)
2. 使用 XE8 重新上架:
開發環境:
- Delphi XE8 update 1
- Xcode 6.4
- iOS SDK 8.4
修改源碼:
- 需依官方建議的方法,修改 XE8 的源碼(如果不修改,會閃退):
http://community.embarcadero.com/blogs/entry/workaround-steps-for-building-ios-32-bit-applications-for-ios-9-with-xe7-and-xe8
真機測試(以下機種皆不閃退):
- iPhone 3GS v6.1.2 (32 bit)
- iPhone 4 v7.1.2 (32 bit)
- iPhone 4S v9.0 (32 bit)
- iPhone 5S v8.4.1 (64 bit)
- iPad 2 mini v9.0 (64 bit)
趕快重新上架新版 App 吧。
追加整理,依版本整理如下(2015.09.23):
- Xcode 7.0 + SDK 8.4
- XE8 + iOS 6 = 正常
- XE8 + iOS 7 = 正常
- XE8 + iOS 8 = 正常
- XE8 + iOS 9 = 正常
- Xcode 6.4 + SDK 8.4
- XE8 + iOS 6 = 正常
- XE8 + iOS 7 = 正常
- XE8 + iOS 8 = 正常
- XE8 + iOS 9 = 閃退(使用官方修復文件,不閃退)
- Xcode 7.0 + SDK 9.0
- D10 + iOS 6 = 閃退
- D10 + iOS 7 = 閃退
- D10 + iOS 8 = 閃退
- D10 + iOS 9 = 正常
官方 QC 討論:
https://quality.embarcadero.com/browse/RSP-12324
官方 Apple Xcode 各版本下載位置:
https://developer.apple.com/downloads/
- OS X El Capitan
秒退是發生在程序剛剛啟動的時候,在開發、蘋果審核階段都沒有被發現的最大可能性就是,這個問題只會發生在老版系統、老版機型上。
對於很多開發者(尤其是個人開發者),進行所有 iOS 版本,所有 iOS 機型覆蓋測試是有難度的,蘋果審核時也只是重點審核該應用在新機器、新版本下的運行情況,並不關注老系統。所以這也就是為什么會秒退的程序竟然也能通過蘋果的審核。
概括:老機型,或者老系統版本的代碼適配存在問題導致閃退。(很多公司提供測試組一套 測試機 的原因,是為了解決 用戶 體驗 問題。防止用戶 流失。用戶不滿)
在新 iOS 上正常的應用,到了老版本 iOS 上秒退最常見原因是系統動態鏈接庫或Framework無法找到。這種情況通常是由於 App 引用了一個新版操作系統里的動態庫(或者某動態庫的新版本)或只有新 iOS 支持的 Framework,而又沒有對老系統進行測試,於是當 App 運行在老系統上時便由於找不到而秒退。解決辦法是等開發人員發現這個問題后升級程序,或由用戶自行升級其操作系統。
概括:蘋果官方審查力度加大,導致代碼或者數據庫更新,或者項目中使用的第三方代碼已經不適合 當前 的蘋果官方 的審查門檻。
還有一種常見的秒退是程序在升級時,修改了本地存儲的數據結構,但是對用戶既存的舊數據沒有做好升級,結果導致初始化時因為無法正確讀取用戶數據而秒退。這類問題通常只需刪除程序后重新安裝一遍就能解決。但缺點是用戶的既存數據會丟失——就算有備份可能也無濟於事,因為備份下來的舊數據還是無法被正確升級。如果舊數據非常重要,那么就需要聯系開發人員要求其進行程序修正了。
概括:系統升級,數據丟失導致
另一種已經變得不那么常見的秒退原因是 App 的設置不正確。例如在編譯時沒有編譯 ARMv6 的版本,但是設置里卻允許該 App 運行在 ARMv6 處理器的機器上(如:iPhone 1代,iPhone 3G,iPod touch 1、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