2016-12-06 17 views
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) 
     } 
    } 
} 
+0

レルムに追加した後にもう一度クエリを実行する – Tj3n

答えて

0

this thread on the Apple developer forumsによると、コードの実行を停止しませんMPMediaQueryに呼び出します。それは実行を続けます。したがって、実際にユーザーから許可を得た後でのみ、フェッチを実行する必要があります。 :)

iOS 9.3以降では、アプリの権限のステータスを確認し、そうでない場合はリクエストするためのAPIがあります。次に、許可が与えられたときに実行されるクロージャーを指定することができます。これは、アイテムを初めて正しく取りたいときに最適です。アップルフォーラム(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:)から呼び出す必要があります。 :)

関連する問題