MPMediaLibrary에 권한을 부여(허용되지 않음)

오크 팬 Advent Calendar 12 일입니다.

폐사에 19신졸로 입사해 반년 강이 지났습니다.
비즈니스에서 PHP를 사용하고 있으며 개인적으로 모바일 앱을 개발하고 있습니다.
자작 앱은 심사 시에 거부된 문제점을 씁니다.

환경



Xcode 11.2
Swift 4.2
IOS 13.2

문제점



Info.plist에서 Privacy- Media Library Usage Description을 설정하면 권한 화면이 나옵니다.
그 화면이 한 번밖에 나오지 않지만 사용자가 허가 없음을 선택하면 앱 내에서 버튼을 눌러도 반응이 없어져 버렸다.


해결책



UIAlertController로 선택 화면을 만들고 설정 화면까지 날린다.


authorizationStatus
설명


.notDetermined
선택되지 않음

.denied
불허

.authorized
허가


음악 선택 버튼을 누를 때


@IBAction func pickMusic(_ sender: Any) {

        let status = MPMediaLibrary.authorizationStatus()
     //MPMediaLibraryにアクセスできない、選択画面を表示
        if status == .denied {
            self.displayPermissionViewController()
        } else {
            let picker = MPMediaPickerController(mediaTypes: MPMediaType.music)
            picker.delegate = self
            self.present(picker, animated: true, completion: nil)
        }
    }



선택 화면에서 설정합니다를 누르면


func displayPermissionViewController() {
        let alert = UIAlertController(title: "メディアライブラリのアクセス許可を設定しますか?", message: "音楽選択するため", preferredStyle:  UIAlertController.Style.alert)

        alert.popoverPresentationController?.sourceView = self.view

        let cancelAction = UIAlertAction(title: "キャンセル", style: .default, handler: nil)
        alert.addAction(cancelAction)

        let okAction = UIAlertAction(title: "設定します", style: .default) { _ in
       // セッティング画面に行く
            if let url = URL(string: UIApplication.openSettingsURLString) {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }
        }
        alert.addAction(okAction)
        present(alert, animated: true, completion: nil)
    }



전체 코드


import UIKit
import MediaPlayer
class ViewController: UIViewController, MPMediaPickerControllerDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func pickMusic(_ sender: Any) {

        let status = MPMediaLibrary.authorizationStatus()
        //MPMediaLibraryにアクセスできない、選択画面を表示
        if status == .denied {
            self.displayPermissionViewController()
        } else {
            let picker = MPMediaPickerController(mediaTypes: MPMediaType.music)
            picker.delegate = self
            self.present(picker, animated: true, completion: nil)
        }
    }

    func displayPermissionViewController() {
        let alert = UIAlertController(title: "メディアライブラリのアクセス許可を設定しますか?", message: "音楽選択するため", preferredStyle:  UIAlertController.Style.alert)

        alert.popoverPresentationController?.sourceView = self.view

        let cancelAction = UIAlertAction(title: "キャンセル", style: .default, handler: nil)
        alert.addAction(cancelAction)

        let okAction = UIAlertAction(title: "設定します", style: .default) { _ in
            // セッティング画面に行く
            if let url = URL(string: UIApplication.openSettingsURLString) {
                UIApplication.shared.open(url, options: [:], completionHandler: nil)
            }
        }
        alert.addAction(okAction)
        present(alert, animated: true, completion: nil)
    }

    func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) {
        dismiss(animated: true, completion: nil)
    }

    func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
        let musicPlayer = MPMusicPlayerController.applicationMusicPlayer
        musicPlayer.setQueue(with: mediaItemCollection)
        musicPlayer.play()
        dismiss(animated: true, completion: nil)
    }
}

좋은 웹페이지 즐겨찾기