0

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

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

如何在第一次启动时加载它?

应用委托;

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

1 回答 1

0

根据Apple 开发者论坛上的这个帖子,如果尚未授予访问媒体库的权限,则调用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:)方法实现中调用它。:)

于 2016-12-06T19:35:56.717 回答