恢复应用内购买(Swift)

5
我已经在我的应用程序中添加了一个非消耗性的应用内购买来移除广告。购买功能运行正常,但我在还原方面遇到了问题。我不知道该怎么做。
以下是我的购买代码:
    func buyNonConsumable(){
    println("About to fetch the products");
    // We check that we are allow to make the purchase.
    if (SKPaymentQueue.canMakePayments())
    {
        var productID:NSSet = NSSet(object: self.product_id!);
        var productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID);
        productsRequest.delegate = self;
        productsRequest.start();
        println("Fething Products");
    }else{
        println("can't make purchases");
    }
}

// Helper Methods
func buyProduct(product: SKProduct){
    println("Sending the Payment Request to Apple");
    var payment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addPayment(payment);
}

func removeTheAds(){

    userDefaults.setBool(true, forKey: "proUser")
    userDefaults.synchronize()
    print("You are a pro User")

    //Code for removing the ads currently
}

// Delegate Methods for IAP
func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
    println("got the request from Apple")
    var count : Int = response.products.count
    if (count>0) {
        var validProducts = response.products
        var validProduct: SKProduct = response.products[0] as SKProduct
        if (validProduct.productIdentifier == self.product_id) {
            println(validProduct.localizedTitle)
            println(validProduct.localizedDescription)
            println(validProduct.price)
            buyProduct(validProduct);
        } else {
            println(validProduct.productIdentifier)
        }
    } else {
        println("no product found")
    }
}

func request(request: SKRequest!, didFailWithError error: NSError!) {
    println("There was an error");
}

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!)    {
    println("Received Payment Transaction Response from Apple");

    for transaction:AnyObject in transactions {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
            switch trans.transactionState {
            case .Purchased:
                println("Product Purchased");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                removeTheAds()
                break;
            case .Failed:
                println("Purchased Failed");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                break;
                // case .Restored:
            default:
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as SKPaymentTransaction)
                break;
            }
        }
    }

}

如何处理还原操作?我有一个还原按钮,调用这两个函数,但现在该怎么办?

    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
    SKPaymentQueue.defaultQueue().restoreCompletedTransactions()

我看到那个案例中,"Restored"被注释掉了,但我不知道应该填什么。非常感谢您的帮助。

你的代码中有一个错误:默认情况下没有调用 finishTransaction。你必须 始终 调用 finishTransaction - matt
我已经编辑了我的代码。你能检查一下我是否做出了正确的更改吗? - PoisonedApps
是的,那就是你所需要的! - matt
1个回答

6

当支付恢复时,你可以自行决定如何处理。在我的应用程序中,我所做的与.Purchased情况相同 - 我打开隐藏功能。在你的应用程序中,似乎你会关闭广告。实际上,在我的应用程序中,.Purchased.Restored是相同的情况,你也可以这样做。以下是我的一部分代码:

        switch t.transactionState {
        case .Purchased, .Restored:
            // ... turn on the magic ...
        }

那么在我的情况下,我只需要放置我的removeAds()(隐藏广告)方法即可恢复?此外,在我的恢复按钮IBAction中调用SKPaymentQueue.defaultQueue().addTransactionObserver(self)和SKPaymentQueue.defaultQueue().restoreCompletedTransactions()是正确的吗? - PoisonedApps
我认为不需要多次添加相同的事务观察器。我喜欢将应用程序委托作为我的观察器,并在启动时仅添加一次。 - matt
我应该在哪里添加一个警告来显示没有产品可以恢复?目前当我按下恢复按钮时什么也不会发生。 - PoisonedApps
请将这个作为一个新问题提出来! - matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接