iOS 14 StoreKit-未正确调用SKCloudServiceController的requestusertoken

问题描述

我正在尝试使用Apple Music API在iOS 14上播放歌曲。 我拥有开发者的令牌,并且我已请求访问用户苹果音乐的许可。

但是,当我调用requestusertoken api时,它的闭包永远不会被调用,因此显然我从请求中什么都没收到-甚至没有错误。这让我发疯。

这是我的代码。我在做什么错了?

struct Car {
   var speed: Float = 0.0
   var increaseSpeed: (() -> ())?
}
var myCar = Car()
myCar.increaseSpeed = {
    myCar.speed += 30 // The retain cycle occurs here. We cannot use [weak myCar] as myCar is a value type.
}

解决方法

我已经尝试过代码,但有两个主要问题。

首先,DispatchSemaphore 使返回行过早执行。其次,由于最新的 iOS 14.3 问题,原始开发者令牌不起作用。

所以,我首先删除了 DispatchSemaphore。

func getUserToken() {
    var userToken = String()
    
    SKCloudServiceController().requestUserToken(forDeveloperToken: developerToken) { (receivedToken,error) in
        guard error == nil else { return }
        
        if let token = receivedToken {
            userToken = token
            print(userToken)
        }
    }
}

然后在此 repository 之后调整了开发者令牌。

现在,它正在正确打印用户令牌。我希望这会有所帮助。

,

好的,所以我知道发生了什么 - DispatchSemaphore 在创建之后立即被锁定 - 所以它永远不会执行该代码。一旦我将信号量值设为 1 而不是 0,它就开始执行——但随后由于事件的顺序,我的其余代码出现了问题。

看起来您可能正在使用与我在 Apple Music SDK 集成方面所使用的教程相同的教程——如果是这种情况,我基本上将代码调整为:

  1. 将用户令牌下载到局部变量,然后其他方法开始在它们的请求中引用它。
  2. 仅在 getuserToken() 方法中移除信号量锁
  3. 其余部分重新开始工作,无需更改任何其他 DispatchSemaphore 值。

我绝不是 DispatchSemaphore 的工作原理和使用 Apple Music 用户令牌的最佳实践的专家,但至少想让您知道为什么您和我遇到了同一堵墙——根本没有执行任何代码.

,

我想我们都被困在同一个 tutorial 上。为了解决这个问题,我把它放在一个不同的线程上,因为锁阻塞了主线程,从而阻止了完成处理程序。

DispatchQueue.global(qos: .background).async {
   print(AppleMusicAPI().fetchStorefrontID())
}

如果是同一个教程,这会将 fetchStorefrontID() 和 getUserToken() 方法(由前者调用)放在后台线程上,并允许完成处理程序和 lock.signal() 发生。

如果不是,那么这足以作为答案:

DispatchQueue.global(qos: .background).async {
   getUserToken()
}
,

您是否从Bearer 中删除了developerToken

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...