Покупка iOS в приложении для непотребляемых материалов, на которые влияет IPV6

ios swift in-app-purchase ipv6

1350 просмотра

2 ответа

44 Репутация автора

Я реализую IAP, используя Swift, чтобы разблокировать мою игровую сцену. Хорошо работает на IPv4. Поэтому я отправляю этот двоичный файл на проверку и получаю отказ от Apple, когда они тестируют в сети IPv6.

Отклонить двоичную причину:

Мы обнаружили одну или несколько ошибок в вашем приложении при просмотре на iPhone под управлением iOS 9.3.2 по Wi-Fi, подключенному к сети IPv6. В частности, после того, как мы приобретаем In App Purchase, уровень не разблокируется.

Я ставил точку останова для каждого случая, но программа не входила ни в один из них, когда я работал в сети IPv6.

Вот мой код для покупки:

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

    for transaction:AnyObject in transactions {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
            switch trans.transactionState {
            case .Purchased:
                print("Product Purchased");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                self.levelButtonHalloween.enabled = true
                lockImage.removeFromSuperview()
                Overlay.removeFromSuperview()
                userSettingDefaults.setBool(true, forKey: "enableHalloween")
                userSettingDefaults.synchronize()
                DesertOver50 = userSettingDefaults.boolForKey("enableHalloween")
                buyBottom.removeFromSuperview()
                backgroundImage.removeFromParent()
                backgroundImage = SKSpriteNode(imageNamed: "StageSelect_Background2")
                backgroundImage.size = self.frame.size
                backgroundImage.position = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
                backgroundImage.anchorPoint = CGPointMake(0.5, 0.5)
                backgroundImage.zPosition = 0
                addChild(backgroundImage)
                break;
            case .Failed:
                print("Purchase Failed");
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                break;
            case .Restored:
                print("Transaction restored")
                SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
                self.levelButtonHalloween.enabled = true
                lockImage.removeFromSuperview()
                Overlay.removeFromSuperview()
                userSettingDefaults.setBool(true, forKey: "enableHalloween")
                userSettingDefaults.synchronize()
                DesertOver50 = userSettingDefaults.boolForKey("enableHalloween")
                buyBottom.removeFromSuperview()
                backgroundImage.removeFromParent()
                backgroundImage = SKSpriteNode(imageNamed: "StageSelect_Background2")
                backgroundImage.size = self.frame.size
                backgroundImage.position = CGPoint(x: frame.size.width / 2, y: frame.size.height / 2)
                backgroundImage.anchorPoint = CGPointMake(0.5, 0.5)
                backgroundImage.zPosition = 0
                addChild(backgroundImage)
            default:
                break;
            }
        }
    }
    SKPaymentQueue.defaultQueue().removeTransactionObserver(self)
}

Я также использую кнопку для восстановления покупки, и она хорошо работает как для ipv4, так и для ipv6.

Вот код для восстановления покупки:

func restorePurchaseButtonAction(){
    button_Clicked()
    if (DesertOver50 == false){
        if (SKPaymentQueue.canMakePayments()) {
            // Enable SKPayment as soon as possible during viewdidload
            SKPaymentQueue.defaultQueue().addTransactionObserver(self)
            SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
        }
    }else{
        let alert = UIAlertController(title: "It's already unlocked ¬_¬", message: "Your have already unlocked or purchased the item(s)", preferredStyle: .ActionSheet)
        let ok = UIAlertAction(title: "OK", style: .Cancel) { action -> Void in
        }
        alert.addAction(ok)
        alert.popoverPresentationController?.sourceView = view
        alert.popoverPresentationController?.sourceRect = self.frame
        self.view?.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
    }
}

Кто-нибудь имел опыт этого раньше? Любой другой реализовать IAP на IPv4 против IPv6? Что я должен делать дальше?

Автор: Justintas Источник Размещён: 19.07.2016 12:31

Ответы (2)


1 плюс

11 Репутация автора

Проверяете ли вы свои настройки в ItunesConnect, правильно ли зарегистрирована покупка в приложении? Не забудьте поставить

SKPaymentQueue.defaultQueue (). AddTransactionObserver (Я)

в viewDidLoad. Эта проблема преследует меня тоже.

Автор: AdamOoi85 Размещён: 19.07.2016 11:40

1 плюс

44 Репутация автора

Спасибо за совет. Мой ituneConnect кажется в порядке.

это SKPaymentQueue.defaultQueue().addTransactionObserver(self)коренная причина моей проблемы.

Сценарий 1: Предмет полностью куплен, но этап не разблокирован => Ошибка

func buyNonConsumable() {
    button_Clicked()
    print("About to fetch the products");
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)      
    // We check that we are allow to make the purchase.
    if (SKPaymentQueue.canMakePayments()) {
        let productID:NSSet = NSSet(object: self.product_id!);
        let productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as! Set<String>);
        productsRequest.delegate = self;
        productsRequest.start();
        print("Fething Products");
    } else {
        print("can't make purchases");
    }
}

Сценарий 2: автоматическая разблокировка элемента при запуске приложения без необходимости входа => Fail

override func didMoveToView(view: SKView) {  
// In-App button and function call
    if(DesertOver50 == false) {
        product_id = "xxxxxxxx";
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)     
        addBotton();

Сценарий 3: работает должным образом

func buyProduct(product: SKProduct) {
    print("Sending the Payment Request to Apple");
    let payment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addPayment(payment);
    SKPaymentQueue.defaultQueue().addTransactionObserver(self)
}

Из того, что я понимаю, сценарий 2 должен быть наилучшим решением, но он проваливается. Поскольку код теперь работает отлично, я предполагаю, что сценарий 3 является решением.

Автор: Justintas Размещён: 20.07.2016 04:39
Вопросы из категории :
32x32