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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,049评论 25 709
  • 大白健康系统--iOS APP运行时Crash自动修复系统 前言 大白(Baymax),迪士尼动画《超能陆战队》中...
    鼠犬玉阅读 17,567评论 22 158
  • 画的不太好,还要继续画,这幅头型不好画,我抓不准头发的厚薄,夏目的头圆圆的,头发中分松软,不好把握。万年难画脸型,...
    福尔摩小思爱学习阅读 319评论 1 2