In-App Purchase работает на iPhone, но не iPad

У меня проблема с покупками In-App на iOS. У меня есть 5 покупок в приложении в игре, все из которых работают точно так, как ожидалось, когда тестировались на iPhone 6 (iOS 8.3). Когда я иду тестировать iPad Air 2 (iOS 8.2), все IAP немедленно сбой. Кто-нибудь еще испытал эту проблему? Есть ли какой-то код, специфичный для iPad, который я должен добавить?

EDIT: Странно, обновление iPad до iOS 8.3 устранило проблему. Любые идеи относительно того, почему этот вопрос возникает? Должен ли я изменить приложение, чтобы поддерживать только iOS 8.3 и выше?

Чтобы протестировать приложение, я использую TestFlight, то же сетевое подключение и тот же Apple ID.

Код, который я использую для покупок в приложении, находится ниже:

func inApp() {
    if (SKPaymentQueue.canMakePayments())
    {
        var productID:NSSet = NSSet(object: product_id);
        var productsRequest:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set<NSObject>);
        productsRequest.delegate = self;
        productsRequest.start();
    }else{
        displayAlert()
    }
}

func buyProduct(product: SKProduct){
    var payment = SKPayment(product: product)
    SKPaymentQueue.defaultQueue().addPayment(payment);

}

func productsRequest (request: SKProductsRequest, didReceiveResponse response: SKProductsResponse) {
    var count : Int = response.products.count
    if (count>0) {
        var validProducts = response.products
        var validProduct: SKProduct = response.products[0] as! SKProduct
        if (validProduct.productIdentifier == product_id) {
            println(validProduct.localizedTitle)
            println(validProduct.localizedDescription)
            println(validProduct.price)
            buyProduct(validProduct);
        } else {
            println(validProduct.productIdentifier)
        }
    } else {
        displayAlert()
    }
}


func request(request: SKRequest!, didFailWithError error: NSError!) {
    self.displayAlert()
}

func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!)    {
    for transaction:AnyObject in transactions {
        if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
            switch trans.transactionState {
            case .Purchased:
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                if product_id == "com.shv.FrenzyTenLives" {
                    defaults.setInteger(10, forKey: "totalLives")
                } else if product_id == "com.shv.FrenzyFiveLives" {
                    defaults.setInteger(5, forKey: "totalLives")
                } else if product_id == "com.shv.FrenzyInfiniteLives" {
                    defaults.setBool(true, forKey: "infiniteLives")
                } else if product_id == "com.shv.FrenzyShield" {
                    defaults.setInteger(5, forKey: "shieldValue")
                } else if product_id == "com.shv.FrenzyRemoveAds" {
                    defaults.setBool(true, forKey: "adsRemoved")
                    adBanner.hidden = true
                }
                break;
            case .Failed:
                SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
                self.displayAlert()
                break;
            case .Restored:
                SKPaymentQueue.defaultQueue().restoreCompletedTransactions()
                if product_id == "com.shv.FrenzyTenLives" {
                    defaults.setInteger(10, forKey: "totalLives")
                } else if product_id == "com.shv.FrenzyFiveLives" {
                    defaults.setInteger(5, forKey: "totalLives")
                } else if product_id == "com.shv.FrenzyInfiniteLives" {
                    defaults.setBool(true, forKey: "infiniteLives")
                } else if product_id == "com.shv.FrenzyRemoveAds" {
                    defaults.setBool(true, forKey: "adsRemoved")
                    adBanner.hidden = true
                }
                break;
            default:
                break;
            }
        }
    }
}

Ответы

Ответ 1

Без определения "немедленно сбой" я могу догадаться, что вы не вошли в действующую тестовую учетную запись на iPad, и в середине обновления версии iOS это было согласовано, поэтому она работает на 8.3.

Самый простой способ получить IAP-тестирование - выйти из iTunes:

Settings -> App and iTunes Store -> Tap apple ID and log out.

После того, как вы вышли из системы, попробуйте сделать IAP, и вам будет предложено войти в систему - после ввода правильных учетных данных тестовой учетной записи, IAP будет загружаться - если это не так, отправьте здесь свои файлы журналов. Обратите внимание: вы можете найти или создать тестовые учетные записи внутри iTunes Connect.

IAP - чрезвычайно сложный объект с многочисленными пунктами отказа - зная, что ваши IAP работают на одном устройстве, но не в другом, указывает на проблему конфигурации, характерную для устройства, на котором IAP не удалось.

Ответ 2

Обычно, когда одно устройство не будет выполняться при покупке приложения, это параметр под ограничениями.

Если вы отметили и отключили это ограничение или все ограничения, вы можете часто исправить это, полностью выйдя из App Store и отключив устройство. Когда он начнется чисто, вы можете снова войти в систему. Когда вы входите в систему, обязательно купите что-нибудь (бесплатную песню недели, бесплатное приложение или даже платное приложение), чтобы пройти проверку вопросов. После этого перепроверьте IAP (покупка в приложении), чтобы убедиться, что все работает.

В крайнем случае вам может потребоваться обратиться в Apple Support для Apple ID, но чаще всего вы можете исправить это, не требуя их помощи.

Вы должны проверить следующее.

Удостоверьтесь, что вы можете ответить "Да" на каждый из этих вопросов:

  • Вы включили In-App Purchase для своего идентификатора приложения?
  • Вы проверили Очистить для продажи для вашего продукта?
  • Соответствуют ли ваши проекты .plist Bundle ID вашему идентификатору приложения?
  • Вы создали и установили новый профиль обеспечения для нового идентификатора приложения?
  • Вы настроили свой проект на кодовый знак, используя этот новый профиль подготовки?
  • Используете ли вы полный идентификатор продукта при создании SKProductRequest?
  • Вы ждали несколько часов с момента добавления своего продукта в iTunes Connect?
  • Вы пытались удалить приложение с устройства и переустановить?
  • Является ли ваше устройство взломанным? Если это так, вам нужно вернуть джейлбрейк для работы IAP.

Если вы ответили "Нет" на любой из этих вопросов, ваша проблема.

Вы должны посетить следующие ссылки, которые определенно вы получите.

https://www.innofied.com/in-app-purchase-working-ios-solution/