【问题标题】:ios sandbox restored non-consumable IAP without buyingios沙盒无需购买即可恢复非消耗性IAP
【发布时间】:2015-11-13 02:45:15
【问题描述】:

朋友们,关于在沙盒中测试 IAP 的问题。

我的步骤:

  1. 在 iTunes 中注册 - 连接新的沙盒测试器。
  2. 测试手机上的itunes/appstore退出

  3. 从设备中删除应用程序

  4. 在 Xcode 中运行。

所有精美的显示在我的手机上。一切都按照我想要的方式进行。一种情况除外。

我只是不知道,也许它应该在 Sandbox,Sandbox-testers 功能中。

在实现非消耗性 IAP 的视图控制器中,有两个按钮:“购买”和“恢复”。

通过点击“恢复”(ONLY“恢复”),并输入刚刚注册测试人员的id/密码,我预计不会恢复任何东西,因为这个id从未被按下“购买”按钮。

但是恢复成功了。无需购买流程。 没事吧?

我的代码

import UIKit
import StoreKit

class PurchaseUI: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver{

override func viewDidLoad() {

    super.viewDidLoad()
    self.navigationItem.setHidesBackButton(true, animated:true)
    if (SKPaymentQueue.canMakePayments()) {
            let productID: NSSet = NSSet(object: "bla.bla.bla.pro1")
            let request: SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>)
            request.delegate = self
            request.start()
    }
}

@IBAction func buyBtn(sender: AnyObject) {
    for product in flag0{
        let prodID = product.productIdentifier
        if (prodID == ""bla.bla.bla.pro1""){
            flag1 = product
            buyproduct()
            break
        }
    }
}

func fullVers(){
    cashflag = true // global var
}

@IBAction func restorebtn(sender: AnyObject) {
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
}

var flag0 = [SKProduct]()
var flag1 = SKProduct()

func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
    let myProduct = response.products
    for product in myProduct {
        flag0.append(product)
    }
}

func buyproduct(){
    let pay = SKPayment(product: flag1)
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().addPayment(pay as SKPayment)
}

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
    for transaction in queue.transactions {
        let t: SKPaymentTransaction = transaction as SKPaymentTransaction
        let prodID = t.payment.productIdentifier as String
        switch prodID {
        case "bla.bla.bla.pro1":
            fullVers()
        default:
            break
        }
    }
}

func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    for transaction:AnyObject in transactions {
        let trans = transaction as! SKPaymentTransaction
        switch trans.transactionState {
        case .Purchased, .Restored:
            for transaction in queue.transactions {
                let t: SKPaymentTransaction = transaction as SKPaymentTransaction
                let prodID = t.payment.productIdentifier as String
                switch prodID {
                case "bla.bla.bla.pro1":
                    fullVers()
                default:
                    break
                }
            }
            queue.finishTransaction(trans)
            break
        case .Deferred:
            queue.finishTransaction(trans)
            break
        case .Failed:
            queue.finishTransaction(trans)
            break
        default:
            break
        }
    }
}

func finishTransaction(trans: SKPaymentTransaction){

}

func paymentQueue(queue: SKPaymentQueue, removedTransactions transactions: [SKPaymentTransaction]) {
}

}

【问题讨论】:

    标签: swift in-app-purchase xcode7 sandbox


    【解决方案1】:

    在 paymentQueueRestoreCompletedTransactionsFinished 方法中,您需要检查交易状态 - 无论交易中发生什么,您都授予完全访问权限。该方法返回说交易已完成,但由于没有进行任何购买,所以什么都不应该发生。检查那里的 SKPaymentTransactionStateRestored ,我认为这应该可以解决问题。

    您正在 paymentQueue:updatedTransactions 中进行检查,但不是在那个中。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多