很長的前置條件。
應用第一次安裝后,第一次調用相機,此時彈出系統提示,如果選擇拒絕,應用會crash。
這個問題主要在iOS10以后才被我發現。
因為在iOS10之前,手機會記錄同一個應用,即使應用被刪除,下次再安裝的時候也不會彈系統提示,除非修改BundleID,讓系統識別成兩個應用。
iOS10之后,每次刪掉應用后第一次訪問相機,都會提示系統級別授權,所以把這個問題暴露出來了。
再次重現的時候連到真機調試的時候打了全局斷點,結果發現崩潰在設置自定義的alertWindow的frame這句。po了一下發現alertWindow沒有出現空指針。那么原因很明顯了。在操作UI的時候出現了crash,原因是操作UI沒有在主線程。回到代碼里看發現調用相機狀態的判斷
let authStatus = AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo)
switch authStatus {
case .NotDetermined:
AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted) in
if (granted) {
//第一次用戶接受
if let tmp = handle {
tmp()
}
}else{
//用戶拒絕 *** 問題在這里,如果第一次用戶拒絕了,回調并不在主線程。(注意,此時的case分支在用戶并未決定里)
if let tmp = limitHandle {
dispatch_async(dispatch_get_main_queue(), {
tmp()
})
}
}
})
case .Restricted: // 無法訪問
dLog("沒有設備")
case .Denied: // 用戶拒絕
if let tmp = limitHandle {
dispatch_async(dispatch_get_main_queue(), {
tmp()
})
}
case .Authorized: // 開啟授權
if let tmp = handle {
tmp()
}
}
把用戶第一次決定是否要同意使用相冊的地方回調放到主線程,即可解決這個問題。