第一次调用相机时弹出系统提示选择拒绝应用Crash的问题
2016-11-17 本文已影响50人
马克叔_Marco
很长的前置条件。
应用第一次安装后,第一次调用相机,此时弹出系统提示,如果选择拒绝,应用会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()
}
}
把用户第一次决定是否要同意使用相册的地方回调放到主线程,即可解决这个问题。