0

Apple 在 StoreKit 框架中提供了一种方法来检测用户是否订阅了苹果音乐,尽管它根本不起作用。我订阅了 Apple Music,既可以在我的应用程序中收听歌曲,也可以从我的应用程序中将项目添加到我的资料库中——但是,当我请求我的功能时,它并没有说我也有。这是我的代码:

let serviceController = SKCloudServiceController()
serviceController.requestCapabilities { (capability:SKCloudServiceCapability, err:Error?) in
    print("error in capability check is \(err)")
    switch capability {
    case SKCloudServiceCapability.musicCatalogPlayback:
        print("user has Apple Music subscription and can play music from apple music api")
    case SKCloudServiceCapability.addToCloudMusicLibrary:
        print("user has an Apple Music subscription, can play music from api, also can add to their music library")
    case SKCloudServiceCapability.musicCatalogSubscriptionEligible:
        print("user does not have subscription")
    default:
        print("default and capability is \(capability.rawValue)")
    }
}

每次我运行我的应用程序时,它都会打印“默认值和能力为 257”。我已经尝试卸载/重新安装可能十几次了——每次都一样。

请注意,我确实可以通过 Apple Music api 获取我的用户令牌并将歌曲添加到我的库中。

其他任何人都经历过这种情况,是否有另一种解决方法来查看用户是否订阅了 Apple Music?

4

2 回答 2

1

capability是一个OptionSet用户可能具有musicCatalogPlaybackaddToCloudMusicLibrary或两者兼有的能力。

您看到的原始值是OR实际值的按位计算,因为正如您所说,您拥有这两种能力。

您可以使用一系列if语句或特定if语句来检查您需要的功能:

let serviceController = SKCloudServiceController()
serviceController.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 and can play music from apple music api")
    }

    if capability.contains(SKCloudServiceCapability.addToCloudMusicLibrary) {
        print("user has an Apple Music subscription, can play music from api, also can add to their music library")
    }

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

用户订阅了 Apple Music,可以从 Apple Music api 播放音乐

用户订阅了 Apple Music,可以从 api 播放音乐,也可以添加到他们的音乐库

于 2019-01-14T04:36:10.070 回答
0

您可以使用以下功能检查 Apple Music 订阅不起作用/用户没有订阅。

var cloudServiceController: SKCloudServiceController? var cloudServiceSetUpController: SKCloudServiceSetupViewController?

内部函数 appleMusicRequestCapabilities(){

    if let aController = AppleMusicSharedInstance.shared.cloudServiceController{

        aController.requestCapabilities { (capabilities, error) in

            if error != nil{
                debugPrint("Error", error ?? "Unexpected Error")
            }else{
                if capabilities.contains(SKCloudServiceCapability.musicCatalogPlayback){
                    debugPrint("musicCatalogPlayback")
                }
                if capabilities.contains(SKCloudServiceCapability.musicCatalogSubscriptionEligible){
                    debugPrint("musicCatalogSubscriptionEligible")
                    DispatchQueue.main.async {
                        self.setUpSubscriptionView()
                    }
                }
                if capabilities.contains(SKCloudServiceCapability.addToCloudMusicLibrary){
                    debugPrint("addToCloudMusicLibrary")
                }
            }
        }
    }
}

以下方法可用于显示音乐订阅视图,用户可以在其中选择订阅。

内部函数 setUpSubscriptionView(){

    if let aController = AppleMusicSharedInstance.shared.cloudServiceSetUpController{
        aController.load(options: [SKCloudServiceSetupOptionsKey.action: SKCloudServiceSetupAction.subscribe], completionHandler: { (success, error) in
            DispatchQueue.main.async {
                if success{
                    AppDelegate.delegate().window?.rootViewController?.present(aController, animated: true, completion: nil)
                }
                else if (error != nil){
                    debugPrint("Error", error ?? "Unexpected Error")
                }
            }
        })
    }
}
于 2019-01-17T06:18:09.120 回答