1

したがって、IAP を使用した ViewController に問題があることはわかっていますが、修正方法は不明です。

クラスのデリゲートを追加SKPaymentQueue.defaultQueue().addTransactionObserver(self)して用意します。.viewDidLoadSKProductsRequestDelegate, SKPaymentTransactionObserver

私はこれらの方法を使用して、購入のトランザクションを実行し、購入を復元し、非消耗品の購入に必要な変更を行います。

しかし、ユーザーが何をしてもIAPViewController、アプリをロードした後、ユーザーにログインを求め続けます。ほとんどの場合、ユーザーがアプリを終了してから再び開くときです。

SKPaymentQueue.defaultQueue().removeTransactionObserver(self)ビューを閉じるときに追加しようとしましたが、うまくいかないようでした。

誰にも何か提案はありますか?? このバグのため、アプリをレビューから除外する必要がありました:(

完全なコードは次のとおりです。

class IAPViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver {

var productIDs: Array<String!> = []
var productsArray: Array<SKProduct!> = []

var selectedProductIndex: Int!
var transactionInProgress = false

override func viewDidLoad() {
    super.viewDidLoad()


    productIDs.append("com.COMPANY.NAME.BUY01")
    productIDs.append("com.COMPANY.NAME.BUY02")
    productIDs.append("com.COMPANY.NAME.BUY03")
    productIDs.append("com.COMPANY.NAME.BUY04")

    requestProductInfo()
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
 }

@IBAction func purchase04(sender: AnyObject) {

    selectedProductIndex = 0
    transactionAction()


}

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


    //StoreKit


    func transactionAction() {
        let payment = SKPayment(product: self.productsArray[self.selectedProductIndex] as SKProduct)
        SKPaymentQueue.defaultQueue().addPayment(payment)
        self.transactionInProgress = true

    }

    //Request Products
    func requestProductInfo() {
        if SKPaymentQueue.canMakePayments() {
            let productIdentifiers = NSSet(array: productIDs)
            let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>)

            productRequest.delegate = self
            productRequest.start()

        }
        else {
            print("Cannot perform In App Purchases.")
        }

    }

    func productsRequest(request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
        if response.products.count != 0 {
            for product in response.products {
                print("\(product.localizedTitle)")
                productsArray.append(product)
            }
        }
        else {
            print("There are no products.")
        }

        if response.invalidProductIdentifiers.count != 0 {
            print("\(response.invalidProductIdentifiers.description)")
        }

        print("Number of products in productsArray \(productsArray.count) - Number of products in productIDs \(productIDs.count)")

}


    //Payment Observer
    func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
        for transaction in transactions {
            switch transaction.transactionState {
            case SKPaymentTransactionState.Purchased:
                print("Transaction completed successfully.", terminator: "")
                self.deliverProduct(transaction)
                SKPaymentQueue.defaultQueue().finishTransaction(transaction)
                transactionInProgress = false

            case SKPaymentTransactionState.Failed:
                print("Transaction Failed", terminator: "");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction)
                transactionInProgress = false

            default:
                print(transaction.transactionState.rawValue, terminator: "")
            }
        }
    }

    func deliverProduct(transaction:SKPaymentTransaction) {

        if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY01"
        {
            print("Consumable Product 1 Purchased")

        }
        else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY02"
        {
            print("Consumable Product 2 Purchased")
        }
        else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY03"
        {
            print("Product 3 purchased")
        }
        else if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY04"
        {
            print("Product 4 purchased")
        }

    }

//Restore Purchases

func paymentQueueRestoreCompletedTransactionsFinished(queue: SKPaymentQueue) {
    print("Transactions Restored")

    let purchasedItemIDS = []


    for transaction:SKPaymentTransaction in queue.transactions {

        if transaction.payment.productIdentifier == "com.COMPANY.NAME.BUY04"
        {
            print("Consumable Product Purchased")

        }

    }

    let alertController = UIAlertController(title: "Restored Purchases", message: "Your purchases have been restored. ", preferredStyle: .Alert)

    let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
        // ...
    }
    alertController.addAction(OKAction)

    self.presentViewController(alertController, animated: true) {
        // ...
    }

}

@IBAction func exit(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: nil)

        SKPaymentQueue.defaultQueue().removeTransactionObserver(self)

}

}
4

1 に答える 1