搜索

首页  >  问答  >  正文

xcode - iOS10相机权限设置了之后用户点击不允许crash

这两个Key设置好之后应该是相册和摄像头都可以调用的 但是现在的情况是相册的弹窗出来之后用户点击不允许就没事 访问相机用户点击不允许就会闪退……第二次进入APP就是正常提醒在隐私里开启授权了。
而且第一次出现弹出提示是否允许访问相机点击允许之后很长一段时间的黑屏甚至有的时候并不能打开相机 第二次有了授权之后这个黑屏就消失了
是我少了什么设置吗 相机这个不论点允许还是不允许都有问题

这两种情况遇到过吗?

PHPzPHPz2771 天前650

全部回复(1)我来回复

  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:47:17

    遇到了同样的问题。
    再次重现的时候连到真机调试的时候打了全局断点,结果发现崩溃在设置自定义的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()
                }
            }
    

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

    回复
    0
  • 取消回复