2016-12-06 25 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可以让你检查你的应用程序的权限状态,如果你没有它,请求它。然后它可以让你指定一个闭包,这个闭包在授予权限时执行,这对于当你第一次正确地抓取物品时是最好的。从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:)方法实现中调用它。 :)

相关问题