我做了一个游戏。我没想到它会变得非常流行,所以我不打算为收据验证编写复杂的加密代码。我的游戏的IAP(删除广告)在沙盒模式下运行良好。该应用程序已在大约过去16小时内实时发布,并且存在问题。该应用的行为就像每个人都购买了“移除广告”IAP。
这是我非常基本的收据验证码:
override init(){
super.init()
// storekit delegation
SKPaymentQueue.defaultQueue().addTransactionObserver(self)
if SKPaymentQueue.canMakePayments() {
let request = SKProductsRequest(productIdentifiers: NSSet(object: self.productID))
request.delegate = self
request.start()
}
self.checkReceipt()
}
func checkReceipt(){
if let url = NSBundle.mainBundle().appStoreReceiptURL {
if let receipt = NSData(contentsOfURL: url) {
self.adsRemoved = true
}
}
}
问题:
在我的沙盒环境中..除非我购买了IAP,否则receipt
变量不会被解包。 self.adsRemoved
未设置为true。看起来在应用程序商店本身,这些变量总是被打开。那是怎么回事?我该怎么办。
我现在知道IAP在应用提交后一两天变为活跃的标准。这可能与此有关吗?我知道如果我按下恢复按钮没有任何反应。在我的沙盒环境中,它要求提供凭据..显示成功消息等。
答案 0 :(得分:2)
- 在我的沙盒环境中..收据变量无法获取 除非我购买了IAP,否则将解开包装。 self.adsRemoved不是 被设置为真。这似乎是在应用程序商店本身 变量总是被打开。那是怎么回事?我该怎么办。
醇>
您的checkReceipt()
方法会在-appStoreReceiptURL
指定的网址上检查收据是否存在。
这是有问题的,因为从App Store 下载的每个应用都会包含收据,无论该应用是免费还是付费。
Apple's Receipt Validation Programming Guide中记录了这一点:
从App Store安装应用程序时,它包含一个 加密签名的申请收据,确保 只有Apple可以创建有效的收据。收据存储在 应用程序包。调用NSBundle的appStoreReceiptURL方法 用于查找收据的类。
那为什么它在沙盒模式下适合你呢?这是因为通过Xcode安装的沙盒应用程序不包含收据,直到出现以下任何一种情况:
SKReceiptRefreshRequest
(link)-restoreCompletedTransactions
因此,在坚果外壳中,对于从App Store下载游戏的任何人,您的checkReceipt
方法肯定会将adsRemoved
设置为true,因为您正在检查 PRESENCE收据,由于上述原因,对您没有任何意义。
您需要做的是验证收据是否合法,以及(2)是否表明已进行正确的应用内购买。
- 我现在知道IAP在提交应用程序后的一两天内变得活跃是标准的。这可能与此有关吗?我知道我是否打了 我的恢复按钮没有任何反应在我的沙箱环境中,它要求 凭证..显示成功消息等。
醇>
在应用程序批准后,IAP需要一两天才能激活,并且没有 - 因为您正在检查收据是否存在而未验证收据而发生问题。
不幸的是,收据验证很复杂,但如果你想达到你想要达到的目的(即检查是否已经制作了IAP),则必须进行收据验证。您想要参考此objc.io article on receipt validation以获取有关如何实际验证收据的更多信息。至少,涉及的步骤是:
答案 1 :(得分:0)
您必须验证发送Apple提供的网址的收据数据的收据。之后,根据您将收到的回复,您必须设置值self.adsRemoved = true / false。