第一次调用相机时弹出系统提示选择拒绝应用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()
        }
    }

把用户第一次决定是否要同意使用相册的地方回调放到主线程,即可解决这个问题。

上一篇下一篇

猜你喜欢

热点阅读