gpt4 book ai didi

ios - 快速询问初始 View Controller 的音乐权限

转载 作者:行者123 更新时间:2023-11-28 09:24:34 24 4
gpt4 key购买 nike

我有一个 Split View Controller ,顶 View Controller 设置为一个 TableView Controller ,用于显示可供选择的播放列表列表。第一次加载该应用程序时,它会请求音乐访问权限。回答是确实给了它权限,但表格 View 不显示播放列表。我最终不得不终止该应用程序并再次运行它。我在错误的地方请求音乐库许可吗?它位于顶 View Controller 的 viewWillAppear 中,并将我正在使用的播放列表(因为有些播放列表被屏蔽)存储在一类播放列表中。

        override func viewWillAppear(_ animated: Bool) {
self.clearsSelectionOnViewWillAppear = self.splitViewController!.isCollapsed
super.viewWillAppear(animated)

checkMediaAccessAndSetup()
}

func checkMediaAccessAndSetup() {
let authorizationStatus = MPMediaLibrary.authorizationStatus()
switch authorizationStatus {
case .notDetermined:
// Show the permission prompt.
MPMediaLibrary.requestAuthorization({[weak self] (newAuthorizationStatus: MPMediaLibraryAuthorizationStatus) in
// Try again after the prompt is dismissed.
self?.checkMediaAccessAndSetup()
})
case .denied, .restricted:
// Do not use MPMediaQuery.
return
default:
// Proceed as usual.
break
}
// Do stuff with MPMediaQuery
self.setupPlaylistStore()
tableView.reloadData()
}

最佳答案

您的代码的主要问题是

  • 您完全没有解决在后台线程上调用 requestAuthorization 完成函数这一事实。需要跳出到主线程进行界面操作。

  • 您忽略了最重要的 .authorized 案例。当您有工作要做时,这取决于您的授权状态,如果您获得授权,则必须现在做,但如果您不确定,则必须在授权后做。

因此,这是连贯授权检查的正确方案(如果可以的话,f() 是您总是想做的事情):

let status = MPMediaLibrary.authorizationStatus()
switch status {
case .authorized:
f()
case .notDetermined:
MPMediaLibrary.requestAuthorization() { status in
if status == .authorized {
DispatchQueue.main.async {
f()
}
}
}
// ...
}

如果您将此代码抽象为一个实用程序方法,其中 f 可以是任何东西,您可以在您的应用程序中任何地方执行此操作,而不仅仅是在需要授权的地方启动。

关于ios - 快速询问初始 View Controller 的音乐权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46471116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com