前一段無(wú)意中發(fā)現(xiàn)的,剛下載好的App從AppStore點(diǎn)擊打開的時(shí)候剛啟動(dòng)就會(huì)崩潰,收集不到崩潰信息也無(wú)法復(fù)現(xiàn)這個(gè)效果。聯(lián)想到之前審核的時(shí)候出現(xiàn)的啟動(dòng)崩潰可能就是這個(gè)地方,之前的一篇文章http://m.itdecent.cn/p/30c535697269 。當(dāng)時(shí)連崩潰的現(xiàn)象都無(wú)法復(fù)現(xiàn)只好申訴通過(guò)了,現(xiàn)在找到了這個(gè)現(xiàn)象就有了點(diǎn)頭緒。
查了些資料和測(cè)試了幾個(gè)系統(tǒng)版本,做了下對(duì)比。發(fā)現(xiàn)只有iOS10及以上的系統(tǒng)才會(huì)出現(xiàn)這個(gè)現(xiàn)象,而之前的系統(tǒng)都可以正常的打開。。。查閱了一下iOS10更新的地方也查不出個(gè)所以然來(lái)。。。那就一步一步從調(diào)用的方法中找吧。
正常的流程沒有問(wèn)題就暫時(shí)排除了正常流程的方法,重點(diǎn)看下被別的App喚起和收到推送啟動(dòng)這兩個(gè)地方的方法。
被App喚起方法:
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url NS_DEPRECATED_IOS(2_0, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation NS_DEPRECATED_IOS(4_2, 9_0, "Please use application:openURL:options:") __TVOS_PROHIBITED;
上面三個(gè)App之間互相喚起的方法(有兩個(gè)iOS10之后就棄用了)并沒有做什么操作,就是支付寶微信之類的回調(diào),看了一下也不會(huì)造成什么影響,問(wèn)題應(yīng)該不是出現(xiàn)在這里。
那看下遠(yuǎn)程推送啟動(dòng)App:
- (void)receiveNotificationByLaunchingOptions:(NSDictionary *)launchOptions;
這個(gè)方法里面也沒有寫什么代碼。。。不過(guò)有個(gè)隱藏的BUG。。。并沒有判斷會(huì)不會(huì)出現(xiàn)空值
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
這里我并沒有判斷是不是為空值。。。因?yàn)橥扑投际俏覀儊?lái)的。。??隙]空值。。。直接強(qiáng)行處理userInfo中的信息了,可能造成崩潰,而且未對(duì)空值做正常啟動(dòng)的處理。當(dāng)時(shí)也是猜的,后來(lái)發(fā)現(xiàn)猜對(duì)了。。。
于是做了些修改,為空時(shí)不解析數(shù)據(jù),正常啟動(dòng)App。。。
打包上線。。。測(cè)試。。。問(wèn)題解決了。。。
猜測(cè)可能是iOS10之前的系統(tǒng)從AppStore打開時(shí)并不去調(diào)用這個(gè)方法?因?yàn)槭峭扑?。。。這種方式打開也和推送沾不上邊啊。。?;蛘呤侵耙沧撸皇强瞻?。。。