Swift:ViewDidLoad在接受通知权限请求后不会继续

问题描述 投票:0回答:1

我正在Swift中创建一个iOS应用程序,在AppDelegate中我在didFinishLaunchingWithOptions中插入以下代码来询问通知权限

    let center  = UNUserNotificationCenter.current()
    center.delegate = self
    // set the type as sound or badge
    center.requestAuthorization(options: [.sound,.alert,.badge]) { (granted, error) in
        guard granted else { return }
        DispatchQueue.main.async(execute: {
            application.registerForRemoteNotifications()
        })
    }

同时,在ViewDidLoad中,我以这种方式询问用户麦克风权限:

    func checkPermission()
{
    switch AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeAudio)
    {
    case .authorized:
        print("ok2")
        self.addButton()
        self.voice()
    case .notDetermined:
        AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeAudio, completionHandler: { granted in
            if granted {
                print("ok1")
                self.addButton()
                self.voice()
            else {
                print("ko")
            }
        })

    case .denied:
        print("ko")
    case .restricted:
        return
    }
}

问题是:在接受麦克风权限后,我接受通知权限,但在此之后,ViewController中的代码不会继续(方法addButton和语音不会被执行)。

你可以帮帮我吗?非常感谢你提前

ios swift notifications microphone
1个回答
3
投票

也许问题是由线程问题引起的:AVCaptureDevice.requestAccess中的完成处理程序是在任意工作线程中执行的。如果你在这里做UI的东西(比如添加一个按钮),这必须在主线程中完成,例如

AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeAudio) { granted in
    if granted {
        print("ok1")
        DispatchQueue.main.async { [unowned self] in
            self.addButton()
            self.voice()
        }            
    else {
        print ("ko")
    }
}

但我想知道为什么UIKit在你的情况下不会崩溃(或至少抱怨)。

© www.soinside.com 2019 - 2024. All rights reserved.