我正在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和语音不会被执行)。
你可以帮帮我吗?非常感谢你提前
也许问题是由线程问题引起的: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在你的情况下不会崩溃(或至少抱怨)。