2016-12-06 10 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 (Original ответ любезно 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:). :)