如何解决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 集成方面所使用的教程相同的教程——如果是这种情况,我基本上将代码调整为:
- 将用户令牌下载到局部变量,然后其他方法开始在它们的请求中引用它。
- 仅在
getuserToken()
方法中移除信号量锁 - 其余部分重新开始工作,无需更改任何其他
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
?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。