搜尋

首頁  >  問答  >  主體

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

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

这两种情况遇到过吗?

PHPzPHPz2771 天前652

全部回覆(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
  • 取消回覆