iOS - IAP问题,对应用商店收据感到困惑

时间:2015-03-03 18:38:19

标签: ios objective-c swift in-app-purchase app-store

我做了一个游戏。我没想到它会变得非常流行,所以我不打算为收据验证编写复杂的加密代码。我的游戏的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
        }
    }
}

问题:

  1. 在我的沙盒环境中..除非我购买了IAP,否则receipt变量不会被解包。 self.adsRemoved未设置为true。看起来在应用程序商店本身,这些变量总是被打开。那是怎么回事?我该怎么办。

  2. 我现在知道IAP在应用提交后一两天变为活跃的标准。这可能与此有关吗?我知道如果我按下恢复按钮没有任何反应。在我的沙盒环境中,它要求提供凭据..显示成功消息等。

2 个答案:

答案 0 :(得分:2)

  
      
  1. 在我的沙盒环境中..收据变量无法获取   除非我购买了IAP,否则将解开包装。 self.adsRemoved不是   被设置为真。这似乎是在应用程序商店本身   变量总是被打开。那是怎么回事?我该怎么办。
  2.   

您的checkReceipt()方法会在-appStoreReceiptURL指定的网址上检查收据是否存在。

这是有问题的,因为从App Store 下载的每个应用都会包含收据,无论该应用是免费还是付费。

Apple's Receipt Validation Programming Guide中记录了这一点:

  

从App Store安装应用程序时,它包含一个   加密签名的申请收据,确保   只有Apple可以创建有效的收据。收据存储在   应用程序包。调用NSBundle的appStoreReceiptURL方法   用于查找收据的类。

那为什么它在沙盒模式下适合你呢?这是因为通过Xcode安装的沙盒应用程序不包含收据,直到出现以下任何一种情况:

  1. 通过SKReceiptRefreshRequestlink
  2. 请求收据
  3. 进行应用内购买时,或
  4. 通过-restoreCompletedTransactions
  5. 恢复以前的交易时

    因此,在坚果外壳中,对于从App Store下载游戏的任何人,您的checkReceipt方法肯定会将adsRemoved设置为true,因为您正在检查 PRESENCE收据,由于上述原因,对您没有任何意义。

    您需要做的是验证收据是否合法,以及(2)是否表明已进行正确的应用内购买。

      
        
    1. 我现在知道IAP在提交应用程序后的一两天内变得活跃是标准的。这可能与此有关吗?我知道我是否打了   我的恢复按钮没有任何反应在我的沙箱环境中,它要求   凭证..显示成功消息等。
    2.   

    在应用程序批准后,IAP需要一两天才能激活,并且没有 - 因为您正在检查收据是否存在而未验证收据而发生问题。

    不幸的是,收据验证很复杂,但如果你想达到你想要达到的目的(即检查是否已经制作了IAP),则必须进行收据验证。您想要参考此objc.io article on receipt validation以获取有关如何实际验证收据的更多信息。至少,涉及的步骤是:

    1. 找到您正在做的收据。
    2. 确认收据合法且未被篡改。
    3. 解析收据以确定IAP已经制作,因为即使没有购买IAP也存在收据

答案 1 :(得分:0)

您必须验证发送Apple提供的网址的收据数据的收据。之后,根据您将收到的回复,您必须设置值self.adsRemoved = true / false。