【发布时间】:2020-03-05 10:27:46
【问题描述】:
我正在用 swift 制作一个音乐应用程序。该应用程序允许用户通过他们的 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 和在他们的设备上安装了 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 的案例仍然被调用。我相信我有正确的 url 方案,因为当将"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 时,我收到以下警告:
那为什么设备说我可以打开URL(string: "music://"),即使Apple Music 被删除了? URL 是否可以打开,但结果只是上述警报的呈现?这是确认用户在其设备上安装了 Apple Music 的正确方法吗?有没有办法确认用户在他们的设备上安装了 Apple Music? 如果 Apple 允许用户选择删除 Apple Music 应用,他们还应该让开发者能够检查应用是否已安装。
【问题讨论】:
-
我自己从未使用过 Apple Music,但我相信 Apple 以一种特殊的方式对待这个 url 方案,因为它是他们自己的产品,所以每当你点击那个 url 方案时,他们最好向用户提出建议下载应用程序,而不是返回 false。您是否尝试确定一个有效的 url 方案,该方案实际上会在 Apple Music 中打开一张真正的专辑或播放一首真正的歌曲?例如:
URL(string: "music://trackID=3214534")。也许这个显式 url 方案会以通常的方式处理,但不会触发app restore警报。 -
我尝试了一些使用有效 Apple Music 曲目和艺术家 ID 的 URL,这些 URL 似乎与 Apple Music 没有深度链接:
URL(string: "music://trackId=1377813289")!,URL(string: "music://track=1377813289"),URL(string: "music://artist=562555")!,@987654340 @。我能够进行深度链接的唯一方法是通过URL(string: "https://music.apple.com/us/artist/562555")!之类的方法,但这显然无济于事,因为这是 HTTP。 -
您是否使用 LSApplicationQueriesSchemes 在 info.plist 中将“music://”列入白名单?如果不是,canOpenUrl 应该是行为不端。
-
不幸的是,将我的 info.plist 中的方案列入白名单根本不会改变行为。我的问题是
UIApplication.shared.canOpenURL(URL(string: "music://")!)一直在返回true,即使 Apple Music 应用程序已被删除。当应用程序被删除时,我需要它返回false。将 url 方案列入白名单并不能解决这个问题(我试过了)。 -
你找到更好的解决方案了吗?
标签: ios swift nsurl apple-music