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

标签 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 在提交应用后一两天内激活是标准做法。这可能与那个有关吗?我知道如果我按下恢复按钮什么也不会发生。在我的沙盒环境中,它要求提供凭据.. 显示成功消息等。

最佳答案

  1. in my sandbox environment.. the receipt variable wouldn't get unwrapped unless I had purchased the IAP. self.adsRemoved wasn't being set to true. It seems like on the app store itself, these variables always get unwrapped. What's up with that? What should i do.

您的 checkReceipt() 方法检查 -appStoreReceiptURL 给出的 URL 是否存在收据。

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

这记录在 Apple's Receipt Validation Programming Guide 中:

When an application is installed from the App Store, it contains an application receipt that is cryptographically signed, ensuring that only Apple can create valid receipts. The receipt is stored inside the application bundle. Call the appStoreReceiptURL method of the NSBundle class to locate the receipt.

那么为什么它在沙盒模式下对您有用?这是因为通过 Xcode 安装的沙盒应用程序不包含收据,直到发生以下任一情况:

  1. 通过 SKReceiptRefreshRequest ( link ) 请求收据
  2. 进行应用内购买时,或
  3. 当之前的交易通过-restoreCompletedTransactions恢复时

简而言之,您的checkReceipt 方法肯定会将adsRemoved 设置为true,因为您正在检查从App Store 下载您的游戏的任何人PRESENCE of a receipt,出于上述原因,这对您来说没有任何意义。

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

  1. I know now that it's standard for IAP to become active a day or two after app submission. Could this be related to that? I know if I hit my restore button nothing happens. In my sandbox environment it asks for credentials.. shows a success message, etc.

应用批准后 IAP 需要一两天才能激活的说法是不正确的,不,问题的发生是因为您正在检查收据是否存在,而不是验证收据。

不幸的是,收据验证很复杂,但如果您想实现您想要实现的目标(即检查是否已制作 IAP),则这是必要的。你想引用这个 objc.io article on receipt validation有关如何实际验证收据的更多信息。至少,涉及的步骤是:

  1. 找到收据,这是您已经在做的事情。
  2. 验证收据是否合法且未被篡改。
  3. 解析收据以找出IAP已经完成,因为即使不购买IAP也存在收据

关于iOS - IAP 问题,对应用商店收据感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28839451/

相关文章:

objective-c - Objective-C 中的方法调配

objective-c - 子类化 NSDrawer 的 contentView 以实现完全自定义的抽屉

swift - Swift 中的 DFT 结果与 MATLAB 中的不同

ios - xcode-比较NSDictionary对象的结果与整数

ios - 快速显示本地通知,即使应用程序终止

objective-c - 当我用 BOOL 填充数组时发出警告

swift - 在 Swift 的 NSTextfield 中设置最大字符数(为一个)

ios - TableView 没有附加新数据

ios - 如何在 iOS(Swift4) 中从 facebook 获取 profile_picture 和 friends_lists?

javascript - PhoneGap/Cordova 回调错误 - RestKit 完成函数不在 PhoneGap 中执行