在App Purchase中没有使用沙盒用户恢复事务

时间:2017-07-01 11:39:00

标签: ios swift in-app-purchase sandbox

这似乎是我研究中的常见问题

这一切都是在真实设备上完成的。

我的应用程序购买In App Purchase,但当我恢复In App Purchase时,它没有反应。

在此之后,

    @IBAction func RestoreItem(_ sender: Any) {
            SKPaymentQueue.default().restoreCompletedTransactions()
    print("RESTORING PURCHASES")       
    }

应该调用products request然后调用payment queue函数。 我已经读过,如果iTunes帐户不包含未被调用的购买。 如果我运行应用程序并购买应用程序购买的每个项目,并且说这些已经购买过,因此它知道购买历史记录

我无法理解的是,如果它知道已购买的物品,它在调用该功能后没有反应(如上所示)。

如果我在设备上完全退出iTunes帐户并触发上述操作,则会要求我登录我的帐户。我这样做(与我之前购买的帐户相同)并且它不会触发product request(我有NSlog个陈述,以查看我所处的状态)

任何想法,因为我一直在努力奋斗这几天。 感谢

我在下面提供了代码,这适用于购买(仅供参考)。

    func productsRequest(_ request: SKProductsRequest, didReceive     response: SKProductsResponse) {
    print("product request")
    let myProduct = response.products
    for product in myProduct {
        print("product added")
        print(product.productIdentifier)
        print(product.localizedTitle)
        print(product.localizedDescription)
        print(product.price)

        list.append(product)
    }

   }


   func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
    print("add payment")

    for transaction: AnyObject in transactions {
        let trans = transaction as! SKPaymentTransaction
        print(trans.error as Any)

        switch trans.transactionState {
        case SKPaymentTransactionState.purchased:
            print("buy ok, unlock IAP HERE")
            print(p.productIdentifier)





            let prodID = p.productIdentifier

            switch prodID {
            case "com.clivedancey.social":
                print("Social Reality Unlocked")
                 outBuySocial.setTitle("Social Reality Enabled", for: UIControlState.normal)
                SocialReality()

            case "com.clivedancey.inapp":
                print("MAIN UPGRADE UNLOCKED")

                 outBuyMain.setTitle(" Main Upgrade Complete", for: UIControlState.normal)
                mainunlock()

            default:
                print("IAP not setup")
            }


            queue.finishTransaction(trans)

        case SKPaymentTransactionState.restored:
            print("buy ok, unlock IAP HERE")
            print(p.productIdentifier)


            let prodID = p.productIdentifier

            switch prodID {
            case "com.clivedancey.social":
                print("Social Reality Unlocked")
                outBuySocial.setTitle("Social Reality Enabled", for: UIControlState.normal)

                SocialReality()
                outTransactionLabel.text = " Purchases restored"


            case "com.clivedancey.inapp":
                print("MAIN UPGRADE UNLOCKED")

                outBuyMain.setTitle(" Main Upgrade Complete", for: UIControlState.normal)
                outTransactionLabel.text = " Purchases restored1"
                mainunlock()

            default:
                print("IAP not setup")
            }


            queue.finishTransaction(trans)


        case.failed:
            print("buy error")


            queue.finishTransaction(trans)
            break

        default:
            print("Default")
            break

        }
    }
}

1 个答案:

答案 0 :(得分:3)

一些事情。首先 - 希望不重要 - 是你使用"反应"在但是当我来恢复In App Purchase时它没有反应。我希望你意味着断点永远不会被击中。

我的StoreKit代码有两件我在你发布的代码中看不到的东西。

(1)在viewDidLoad我检查购买并存储:

func fetchAvailableProducts()  {
    productsRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)
    productsRequest.delegate = self
    productsRequest.start()
}

public func productsRequest (_ request:SKProductsRequest, didReceive response:SKProductsResponse) {
    if (response.products.count > 0) {
        iapProducts = response.products
    }
}

值得注意的是将视图控制器设置为代理 - 我在代码中看不到。 (虽然逻辑听起来不错。)

(2)我的恢复购买还有一行额外代码:

func restorePurchases() {
    SKPaymentQueue.default().add(self)
    SKPaymentQueue.default().restoreCompletedTransactions()
}