2015-04-22 26 views
0

我想在應用內購買添加到我的Xcode應用程序,而我得到這個錯誤:終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,理由是:「無效的產品標識:(null)的

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid product identifier: (null)' * First throw call stack: (0x184bf82d8 0x19641c0e4 0x184bf8218 0x189597210 0x100066fa8 0x100067018 0x18966d404 0x1896564e0 0x18966cda0 0x18966ca2c 0x189665f68 0x18963918c 0x1898da324 0x1896376a0 0x184bb0240 0x184baf4e4 0x184bad594 0x184ad92d4 0x18e2ef6fc 0x18969efac 0x100069600 0x196a9aa08) libc++abi.dylib: terminating with uncaught exception of type NSException

我曾嘗試使用IOS模擬器和使用我的iPhone設備來運行我的應用程序。

完全ViewController.swift代碼:

import UIKit 
import StoreKit 

class ViewController: UIViewController, SKPaymentTransactionObserver, SKProductsRequestDelegate{ 

    var product:SKProduct! 

    @IBOutlet weak var lastmanstandingButton: UIButton! 
    @IBOutlet weak var upgradeProButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     lastmanstandingButton.enabled = false 
     SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
    } 

     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
    } 

    func productsRequest(request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!) { 
     let products = response.products 
     if (products.count != 0) 
     { 
      product = products[0] as! SKProduct; 
      //productInfo.text = product.localizedTitle + "\n" + product.localizedDescription 
     } 
    } 

    func getProductInfo(){ 
     if (SKPaymentQueue.canMakePayments()){ 
      let productID:NSSet = NSSet(object:"com.mi.yaya.inapp1"); 
      let request:SKProductsRequest = SKProductsRequest(productIdentifiers: productID as Set<NSObject>) 
      request.delegate = self; 
      request.start() 
     } 
    } 

    @IBAction func upgradeProButtonAction(sender: AnyObject) { 
     let payment:SKPayment = SKPayment(product: product); 
     SKPaymentQueue.defaultQueue().addPayment(payment) 
    } 

    func unlockProFeatures(){ 
     lastmanstandingButton.enabled = true 
    } 

    func paymentQueue(queue: SKPaymentQueue!, updatedTransactions transactions: [AnyObject]!) { 
     for transaction:AnyObject in transactions { 
      if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{ 
       switch trans.transactionState { 
       case .Purchased: 
        self.unlockProFeatures(); 
        SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction) 
        break 
       case .Failed: 
        SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction) 
        break 
       case .Restored: 
        SKPaymentQueue.defaultQueue().restoreCompletedTransactions() 
        break 
       default: 
        break 
       } 
      } 
     } 
    } 
} 

教程使用IAP:https://www.youtube.com/watch?v=hnRO87_2GpQ

編輯:在iTunes Connect中我已經加入我創建的應用程序的應用內購買。它說:狀態:準備提交

回答

0

看來您並未正確設置產品標識。檢查您正在撥打getProductInfo的位置,並且ID是否正確設置。同時檢查您的方法調用的順序,並確保您在正確的時刻發送ID。

我想指出,你可能想提高一些行:

  • 您應該設置product作爲一個可選的,因爲如果你的請求不返回一個值,你的應用程序會崩潰
  • productsRequest是不是一個好的方法名稱。相反,你可以使用requestProducts
+0

productID是正確的。我甚至將iTunes Connect IAP中的productID複製/粘貼到xCode項目中。我看不出這裏有什麼問題。 –

+0

我確定您正在設置正確的ID,但通過在'getProductInfo'中設置斷點來檢查它是否正確發送。 –

0

我回答我的問題,因爲我發現使用另一個代碼的解決方案:

import UIKit 
import StoreKit 

class ViewController: UIViewController, SKProductsRequestDelegate, SKPaymentTransactionObserver { 

    var product_id: NSString?; 

    @IBOutlet weak var lastmanstandingButton: UIButton! 
    @IBOutlet weak var upgradeProButton: UIButton! 

    override func viewDidLoad() { 
     product_id = "com.mi.yaya.inapp1"; 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     lastmanstandingButton.enabled = false 
     SKPaymentQueue.defaultQueue().addTransactionObserver(self) 
    } 

     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
    } 

    @IBAction func upgradeProButtonAction(sender: AnyObject) { 
     buyConsumable() 
    } 

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

    // Helper Methods 

    func buyProduct(product: SKProduct){ 
     println("Sending the Payment Request to Apple"); 
     var payment = SKPayment(product: product) 
     SKPaymentQueue.defaultQueue().addPayment(payment); 

    } 


    // Delegate Methods for IAP 

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


    func request(request: SKRequest!, didFailWithError error: NSError!) { 
     println("La vaina fallo"); 
    } 

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

     for transaction:AnyObject in transactions { 
      if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{ 
       switch trans.transactionState { 
       case .Purchased: 
        println("Product Purchased"); 
        SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction) 
        break; 
       case .Failed: 
        println("Purchased Failed"); 
        SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction) 
        break; 
        // case .Restored: 
        //[self restoreTransaction:transaction]; 
       default: 
        break; 
       } 
      } 
     } 

    } 

} 

資料來源:https://github.com/ivanacostarubio/swift-in-app-purchase-example

我的設備上進行測試,給我輸出:

About to fetch the products 
Fething Products 
got the request from Apple 
Upgrade PRO 
Oppgradere til PRO å få alle funksjoner, fjerne annonser og få fremtidige betalingsoppdateringer gratis. 
19 
Sending the Payment Request to Apple 
Received Payment Transaction Response from Apple 
Received Payment Transaction Response from Apple 
Product Purchased 
相關問題