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

时间:2019-11-08 19:09:13

标签: ios swift nsurl 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")
    }

}

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

因此,我一直在寻找添加检查Apple Music是否在用户设备上的方法。我找到了这个答案:Check whether an app is installed using Swiftthis resource for finding Apple Music's url scheme结合使用,得出的结论是,我可以检查用户是否同时具有 个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")
    }

}

问题是,即使从我的设备中删除了Apple Music,第一种情况,即打印user has Apple Music subscription and has the apple music app installed的情况仍然被调用。我相信我的网址格式正确,因为将"music://"更改为"musi://"时,将调用第二种情况,即打印user does not have subscription or doesn't have apple music installed的情况。

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

enter image description here

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

6 个答案:

答案 0 :(得分:2)

尽管我希望有更好的解决方案,但我得到的最好的解决方案是使用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")
    }

}

我不确定这对于在播放器中使用Apple Music的人是否可以播放曲目以外的其他任何方式,但是当您要演奏支票时,这似乎可以作为支票使用。每当遇到该错误时,我都会创建一个警报,告诉每个人他们已经订阅了Apple Music,但未安装该应用程序。

不过,如果没有一些完成处理程序就可以进行检查,那将是一件很棒的事情,因为这样可以将布尔检查集成到条件语句中(通过if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something })。

答案 1 :(得分:1)

对于需要安装音乐应用才能显示IJSRuntimeExtensionMethodsInstance.Confirm(js, "text"); 的幸运儿,最简单的检查方法是查看是否显示了视图。如果缺少音乐应用,它将静默失败。

MPMediaPickerController

答案 2 :(得分:0)

幸运的是,如果没有注册设备上安装的任何应用程序来处理URL的方案,或者您尚未在Info.plist文件中声明URL的方案,Apple会为您提供一个返回false的方法;否则,是真的。

func canOpenURL(_ url: URL) -> Bool

以下是我发布的网址方案

Open = music://
Open = musics://
Open = audio-player-event://

将要进一步使用的内容添加到info.plist文件中。

此后,请使用“ canOpenURL”进行检查 有关更多信息,请查看Apple文档

https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl

答案 3 :(得分:0)

一种可能的解决方案是执行以下操作:通过Apple Music API(使用过的以便查询Apple Music REST端点)来设置开发者令牌。向以下StoreKit函数(Documentation)提交请求:

requestUserToken(forDeveloperToken:completionHandler:)

如果您的开发人员令牌有效,并且返回的用户令牌值仍为nil / null,则设备用户不是Apple Music服务的订户。 HTTP状态代码生成的错误是401(未授权)。这仍然需要您检查错误,但不需要尝试播放特定的曲目(特别是由于某些原因,如果您检查的内容曲目ID无效或已更改)。

对于已登录设备且已订阅但未下载音乐应用程序的帐户的问题:尝试播放特定内容并向用户提供信息或使用不需要Apple Music订阅的内容时处理错误作为发生错误时的替代方法。

答案 4 :(得分:0)

是的,我们可以按照以下步骤检查大多数应用程序:

  1. 对要打开的特定应用程序使用深层URL URL方案,将其添加到 info.plist
  2. 使用相同的URL并调用此方法
    func canOpenURL(_ url: URL) -> Bool
    let url = URL(string: "music://")

    UIApplication.shared.open(url!) { (result) in
       if result {
          // The URL was delivered successfully!
       }
    }

答案 5 :(得分:0)

只需:UIApplication.shared.canOpenUrl(URL(string: “music://”)!)