美文网首页
第一次调用相机时弹出系统提示选择拒绝应用Crash的问题

第一次调用相机时弹出系统提示选择拒绝应用Crash的问题

作者: 马克叔_Marco | 来源:发表于2016-11-17 11:31 被阅读50次

    很长的前置条件。
    应用第一次安装后,第一次调用相机,此时弹出系统提示,如果选择拒绝,应用会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()
            }
        }
    

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

    相关文章

      网友评论

          本文标题:第一次调用相机时弹出系统提示选择拒绝应用Crash的问题

          本文链接:https://www.haomeiwen.com/subject/qfedpttx.html