我想在启动后在初始屏幕上列出并显示媒体库的歌曲 当我第一次启动时,将显示一个访问媒体库的权限弹出窗口。并没有加载媒体库的歌曲。
退出应用程序并再次打开后,我可以毫无问题地显示媒体库的歌曲。
如何在首次启动时加载它?
的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 :(得分: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:)
方法实现中调用它。 :)