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

ztmd8pv5  于 2023-01-08  发布在  Swift
关注(0)|答案(7)|浏览(199)

我正在用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 Swiftthis 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://")!),我击中了以下警报:

那为什么苹果音乐删除后,设备还说可以打开URL(string: "music://")呢?URL是否可以打开,但结果只是显示上述警告?这是确认用户设备上安装了Apple Music的正确方法吗?甚至有方法确认用户设备上安装了Apple Music吗?如果苹果允许用户选择删除Apple Music应用程序,他们也应该允许开发者检查应用程序是否已安装。

x7yiwoj4

x7yiwoj41#

我所得到的最好的解决方案,虽然我希望有更好的东西在那里,是使用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")
    }

}

我不知道这是否适用于任何人在他们的应用程序中使用苹果音乐播放曲目以外的任何东西,但这似乎肯定是作为一个检查时,你要播放检查。每当我击中这个错误,我只是创建一个警报,告诉个人,他们有苹果音乐订阅,但没有安装应用程序。
尽管如此,如果能够在没有完成处理程序的情况下进行检查,那将是非常棒的,因为这将允许布尔检查集成到条件语句中(通过if capability.contains(SKCloudServiceCapability.musicCatalogPlayback) && hasAppleMusicAppInstalled { //do something })。

jgzswidk

jgzswidk2#

幸运的是,苹果提供了一个方法,如果设备上安装的应用程序没有注册来处理URL的方案,或者如果您没有在Info.plist文件中声明URL的方案,该方法将返回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

gz5pxeao

gz5pxeao3#

对于那些需要安装音乐应用程序才能显示MPMediaPickerController的幸运儿来说,最简单的检查方法是查看是否显示了视图。如果音乐应用程序丢失,它将无声地失败。

let mediaPickerController = MPMediaPickerController(mediaTypes: MPMediaType.anyAudio)
mediaPickerController.delegate = self
mediaPickerController.prompt = "prompt"
presenter.present(mediaPickerController, animated: true, completion: nil)

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(500)) { [weak self] () -> () in
    if self?.presenter.presentedViewController == nil {
        self?.callback(.failure(.failedToPresentMusicPickerError))
    }
}
piah890a

piah890a4#

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

requestUserToken(forDeveloperToken:completionHandler:)

如果您的开发者令牌有效,并且返回的用户令牌值仍为nil/null,则设备用户不是Apple Music服务的订户。生成的错误的HTTP状态代码为401(未授权)。这仍然需要您检查错误,但不需要尝试和播放特定的轨道(特别是由于某些原因,如果您检查的内容轨道ID变为无效或更改)。
对于帐户已登录设备并已订阅但未下载音乐应用程序的问题:在尝试播放特定内容时处理错误,并在发生错误时向用户提供信息或使用不需要Apple Music订阅的内容作为替代。

dced5bon

dced5bon5#

是的,我们可以通过以下步骤检查大多数应用程序:
1.为您要打开的特定应用程序使用深层URLURL方案,并将其添加到info.plist
1.使用相同的URL并调用此方法

func canOpenURL(_ url: URL) -> Bool
let url = URL(string: "music://")

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

hwazgwia6#

您可以使用此属性来检测是否安装了Apple Music。

import MediaPlayer
var isAppleMusicInstalled: Bool {
    get async {
        await withCheckedContinuation { continuation in
            MPMusicPlayerController.systemMusicPlayer.setQueue(with: ["1108845248"])
            self.systemMusicPlayer.prepareToPlay { (error) in
                if error != nil && error!.localizedDescription.contains("error 6") {
                    print("Apple Music App not installed")
                    continuation.resume(returning: false)
                } else {
                    continuation.resume(returning: true)
                }
            }
        }
    }
}

请注意,它会触发一个权限对话框,您需要在您的Info.plist中添加NSAppleMusicUsageDescription键,并带有类似于"检查是否安装了Apple Music"的值。

0tdrvxhp

0tdrvxhp7#

简单地执行:UIApplication.shared.canOpenUrl(URL(string: “music://”)!)

相关问题