应用程序内购买适用于iPhone但不适用于iPad

时间:2015-04-17 18:54:43

标签: ios swift in-app-purchase storekit

我在iOS上进行应用内购买时遇到问题。我在游戏中有5个应用内购买,所有这些都在iPhone 6(iOS 8.3)上测试时完全按照预期工作。当我在iPad Air 2(iOS 8.2)上进行测试时,所有IAP都会立即失败。还有其他人遇到过这个问题吗?是否有一些我必须添加的特定于iPad的代码?

编辑:奇怪的是,将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;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

通常情况下,如果某个设备无法在应用内购买,则会受到限制设置。

如果您已经检查并禁用了该限制或所有限制 - 您通常可以通过完全退出App Store并关闭设备来解决此问题。干净地启动时,您可以再次登录。当您登录时,请务必购买一些内容(本周免费歌曲,免费应用程序甚至是付费应用程序)来完成验证问题。完成后,重新检查IAP(应用内购买)以确保功能正常。

作为最后的手段,您可能需要联系Apple支持部门获取Apple ID - 但大多数情况下您无需他们的帮助即可解决此问题。

您应该检查以下内容。

确保您对以下每个问题都回答“是”:

  • 您是否为应用ID启用了应用内购买?
  • 您是否已检查过您的产品已清关待售?
  • 您项目的.plist捆绑ID是否与您的应用ID相匹配?
  • 您是否为新的App ID生成并安装了新的配置文件?
  • 您是否已使用此新配置文件将项目配置为代码签名?
  • 您在制作SKProductRequest时是否使用完整的产品ID?
  • 自从将产品添加到iTunes Connect后,您有几个小时的时间?
  • 您是否尝试从设备中删除该应用并重新安装?
  • 你的设备越狱了吗?如果是这样,您需要恢复IAP的越狱才能正常工作。

如果您对其中任何一个问题的回答是“否”,那就是您的问题。

您应该访问以下链接,绝对可以获得解决方案。

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

答案 1 :(得分:0)

如果没有“立即失败”的定义,我最好的猜测是你没有登录到iPad上的有效沙盒测试帐户,并且在更新iOS版本时这已经被调和,这就是为什么它适用于8.3

让IAP测试工作的最简单方法是退出iTunes:

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

一旦您注销,尝试进行IAP,系统将提示您登录 - 一旦您输入有效的测试帐户凭据,IAP将下载 - 如果没有,请在此处发布您的日志文件。请注意,您可以在iTunes Connect中找到或创建测试帐户。

IAP是一个极其复杂的主题,有许多失败点 - 知道您的IAP在一台设备上运行,而不是另一台设备在IAP发生故障的设备上特定的配置问题。