初始启动时无法加载媒体库

时间:2016-12-06 02:20:15

标签: ios swift realm media-library

我想在启动后在初始屏幕上列出并显示媒体库的歌曲 当我第一次启动时,将显示一个访问媒体库的权限弹出窗口。并没有加载媒体库的歌曲。

退出应用程序并再次打开后,我可以毫无问题地显示媒体库的歌曲。

如何在首次启动时加载它?

的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)
        }
    }
}

1 个答案:

答案 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:)方法实现中调用它。 :)