我正在迅速制作音乐应用。该应用程序允许用户通过其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 Swift与this 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时,我受到以下警告的警告:
那么,为什么设备在删除Apple Music后仍说我可以打开URL(string: "music://")
? URL
是否可以打开,但结果仅仅是上述警报的提示?这是确认用户设备上已安装Apple Music的正确方法吗?甚至还可以确认用户的设备上已安装Apple Music吗? 如果Apple为用户提供了删除Apple Music应用的选项,那么他们还应该使开发人员能够检查该应用是否已安装。
答案 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)
是的,我们可以按照以下步骤检查大多数应用程序:
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://”)!)