如何检查用户设备上是否安装了Apple Music?

Dav*_*pin 7 nsurl ios swift apple-music

我正在快速制作音乐应用。该应用程序允许用户通过其Apple Music应用程序通过其Apple Music订阅播放音乐。我可以通过以下方式检查用户是否有Apple Music订阅:

SKCloudServiceController().requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) {
        print("user has Apple Music subscription")
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) {
        print("user does not have subscription")
    }

}
Run Code Online (Sandbox Code Playgroud)

但是:在某些情况下,某些人会由于某种原因而订阅了Apple Music,但没有在设备上下载Apple Music应用。如果用户有订阅但没有设备,那么我想实质上将这种情况视为他们根本没有订阅,即我们无法通过Apple Music播放音乐。

因此,我一直在寻找添加检查Apple Music是否在用户设备上的方法。我找到了这个答案:检查是否使用Swift结合此资源安装了应用程序以查找Apple Music的url方案,并得出结论,我可以通过以下方式检查用户是否同时在其设备上安装了Apple Music订阅 Apple Music应用程序:

SKCloudServiceController()requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && UIApplication.shared.canOpenURL(URL(string: "music://")!) {
        print("user has Apple Music subscription and has the apple music app installed")
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) || !UIApplication.shared.canOpenURL(URL(string: "music://")!) {
        print("user does not have subscription or doesn't have apple music installed")
    }

}
Run Code Online (Sandbox Code Playgroud)

问题是,即使从我的设备中删除了Apple Music,第一种情况(即打印的user has Apple Music subscription and has the apple music app installed情况)仍然被调用。我相信我有正确的URL方案,因为改变的时候"music://""musi://",对于第二种情况,即一个打印user does not have subscription or doesn't have apple music installed被调用。

尝试打开URL(string: "music://")通过删除的Apple Music时UIApplication.shared.open(URL(string: "music://")!),我收到以下警告:

在此处输入图片说明

那么,为什么在URL(string: "music://")删除Apple Music后设备仍可以打开我的手机?是否URL可以打开,但结果只是上述警报的提示?这是确认用户设备上已安装Apple Music的正确方法吗?甚至还可以确认用户的设备上已安装Apple Music吗?如果Apple为用户提供了删除Apple Music应用程序的选项,则他们还应该使开发人员能够检查该应用程序是否已安装。

Dav*_*pin 5

我得到的最好的解决方案是,虽然我希望有更好的解决方案,但MPMusicPlayer.prepareToPlay(completionHandler:)在尝试播放曲目时使用它来检查是否有错误:

SKCloudServiceController().requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in

    guard err == nil else {
        print("error in capability check is \(err!)")
        return
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) {
        print("user has Apple Music subscription")
        MPMusicPlayerController.systemMusicPlayer.setQueue(with: ["1108845248"])
        systemMusicPlayer.prepareToPlay { (error) in
            if error != nil && error!.localizedDescription == "The operation couldn’t be completed. (MPCPlayerRequestErrorDomain error 1.)" {
                //It would appear that the user does not have the Apple Music App installed
            }
        }
    }

    if capability.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible) {
        print("user does not have subscription")
    }

}
Run Code Online (Sandbox Code Playgroud)

我不确定这如何适用于在他们的应用程序中使用 Apple Music 进行除播放曲目以外的任何其他任何事情的人,但是当您要播放支票时,这似乎绝对可以作为支票。每当我遇到该错误时,我都会创建一个警报,告诉个人他们订阅了 Apple Music 但没有安装该应用程序。

尽管如此,能够在没有完成处理程序的情况下进行检查会很棒,因为这将允许布尔检查集成到条件语句中(通过if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something })。