swift向初始视图控制器请求音乐许可

时间:2017-09-28 14:01:14

标签: ios swift

我有一个拆分视图控制器,顶视图控制器设置为一个表视图控制器,用于显示一个播放列表供选择。第一次加载应用程序时,它会要求获得音乐访问权限。回答是确实给了它权限但表格视图没有显示播放列表。我最终不得不杀死应用程序并再次运行它。我要求音乐库允许错误的地方吗?这是顶视图控制器的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()
}

2 个答案:

答案 0 :(得分:1)

您的代码的主要问题是

  • 您完全没有解决在后台线程上调用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可以是任何内容,您可以在应用程序中执行无处不在的,其中可能需要授权 - 而不仅仅是在启动时。< / p>

答案 1 :(得分:-2)

感谢您的评论,它给了我正在进行的多线程的线索,如果类中没有播放列表继续检查并重新加载表数据,我可以通过计时器调用来修复它。

{{1}}