0

起動後の初期画面にメディアライブラリーの曲を一覧表示したい。
初回起動時、メディアライブラリへのアクセス許可のポップアップが表示されます。また、メディア ライブラリーの曲は読み込まれません。

アプリケーションを終了して再度開くと、問題なくメディア ライブラリの曲を表示できます。

初回起動時にロードするにはどうすればよいですか?

AppDelegate;

let realm:Realm
var library:[MPMediaItem]

override init() {
    realm = try! Realm()

    let query = MPMediaQuery.songs()
    guard let items = query.items else {
        self.library = []
        print("No song loaded")
        return
    }
    self.library = items
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions  launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let userSongs = realm.objects(UserSong.self)
    if userSongs.count == 0 {
        setLibrary()
    }
}


func setLibrary() {
    let request = GetLibraryRequest(library: library)
    let songs = try! request.response()
    for song in songs {
        try! self.realm.write {
            self.realm.add(song)
        }
    }
}
4

1 に答える 1

0

Apple 開発者フォーラムのこのスレッドによると、メディア ライブラリへのアクセス許可がまだ与えられていない場合、 を呼び出してMPMediaQueryもコードの実行は停止しません。実行し続けます。そのため、実際にユーザーから許可を得た後でのみ、フェッチを実行する必要があります。:)

iOS 9.3 以降では、アプリのアクセス許可のステータスを確認し、そうでない場合はアクセス許可を要求できる API があります。次に、許可が付与されたときに実行されるクロージャーを指定できます。これは、アイテムを初めて適切に取得する場合に最適です。

Apple フォーラムからの相互投稿 (元の回答は TheCD 提供):

func exampleMethod() {  
        if #available(iOS 9.3, *) {  
            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?.exampleMethod()  
                    })  
            case .Denied, .Restricted:  
                // Do not use MPMediaQuery.  
                return  
            default:  
                // Proceed as usual.  
                break  
            }  
        }  
        // Do stuff with MPMediaQuery here...  
}  

init()最後に、アプリ デリゲートのメソッドでコードを実行するべきではありません。この時点でアプリのセットアップが完了していない可能性があり、予期しない動作が発生する可能性があります。

アクセス許可を確認し、その時点以降に必要なアクションを実行するメソッドを作成し、application(application:didFinishLaunchingWithOptions:)メソッドの実装から呼び出す必要があります。:)

于 2016-12-06T19:35:56.717 に答える