Swift: ViewDidLoad не продолжается после получения запроса на разрешение уведомлений - PullRequest
0 голосов
/ 13 февраля 2019

Я создаю приложение для iOS в Swift, и в 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 и voice не выполняются).

Не могли бы вы мне помочь?Большое спасибо заранее

1 Ответ

0 голосов
/ 13 февраля 2019

Возможно, проблема вызвана проблемами потоков: обработчик завершения в AVCaptureDevice.requestAccess выполняется в произвольном рабочем потоке.Если вы выполняете здесь пользовательский интерфейс (например, добавляете кнопку), это должно быть сделано в главном потоке, например,

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

Но мне интересно, почему UIKit не вылетает (или, по крайней мере, не жалуется) в вашем случае.

...