2016-11-20 14 views
0

こんにちはアル(スウィフト)アプリ内購入のWi-Fiのエラー

OBS:私は、ユーザーのインターネットが接続されてかないが、この場合、クラスは、インターネットを検証しているかどうかを確認するためにRechibilityクラスを使用しますが、私はいけませんリンゴから情報を受け取る。

1:ちょうど私が決済システムを作成し、それが正常に動作します

この場合 は、しかしであることがクラッシュした場合があり、ユーザーがインターネットに接続せずにアプリに入る(のWi-Fiまたは4G) 2:ユーザーがオフラインでアプリを購入しようとしました。 3:iPhoneのHOMEボタンを押してから、Wi-Fiまたは4Gを接続してください 4:アプリに戻ってからもう一度購入するとクラッシュが表示される

これは、この状況でのみ発生します。他のテストケースでは、エラーは発生しませんでした。

このエラーが発生した理由はわかりません。

以下は私のコードと画像です。

私の現在のコード:

import UIKit 
import StoreKit 

protocol IAPManagerDelegate 
{ 
    func managerDidRestorePurchases() 
} 

class IAPManager: NSObject, SKProductsRequestDelegate,  SKPaymentTransactionObserver, SKRequestDelegate 
{ 

static let sharedInstance = IAPManager() 

var request:SKProductsRequest! 
var products:NSArray! 

//Load product identifiers for store usage 
func setupInAppPurchases() 
{ 
    self.validateProductIdentifiers(self.getProductIdentifiersFromMainBundle()) 

    SKPaymentQueue.default().add(self) 
} 

//Get product identifiers 
func getProductIdentifiersFromMainBundle() -> NSArray 
{ 
    var identifiers = NSArray() 
    if let url = Bundle.main.url(forResource: "iap_product_ids", withExtension: "plist") 
    { 
     identifiers = NSArray(contentsOf: url)! 
    } 

    return identifiers 
} 

//Retrieve product information 
func validateProductIdentifiers(_ identifiers:NSArray) 
{ 

    if Reachability.isConnectedToNetwork() == true 
    { 
     print("Enter") 
     let productIdentifiers = NSSet(array: identifiers as [AnyObject]) 
     let productRequest = SKProductsRequest(productIdentifiers: productIdentifiers as! Set<String>) 
     self.request = productRequest 
     productRequest.delegate = self 
     productRequest.start() 
    } 

} 

func createPaymentRequestForProduct(_ product:SKProduct) 
{ 

    if Reachability.isConnectedToNetwork() == true 
    { 
     let payment = SKMutablePayment(product: product) 
     payment.quantity = 1 
     SKPaymentQueue.default().add(payment) 
    } 
} 


//MARK: SKProductsRequestDelegate 
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) 
{ 
    // 
    self.products = response.products as NSArray! 

    for product in products 
    { 
     let temp = product as! SKProduct 

     if temp.productIdentifier == "monthly.subscription" 
     { 
      print("price: \(temp.price)") 
      formatProductMonth(free: temp) 
     } 
     if temp.productIdentifier == "weekly.subscription" 
     { 
      print("price: \(temp.price)") 
      formatProductFree(free: temp) 
     } 
     if temp.productIdentifier == "yearly.subscription" 
     { 
      print("price: \(temp.price)") 
      formatProductYear(free: temp) 
     } 
    } 
    // print("Product[0]: \(string)") 
    // print("Product[1]: \(prod1.productIdentifier)") 
    // print("Product[2]: \(prod2.productIdentifier)") 
} 

//MARK: SKPaymentTransactionObserver Delegate Protocol 
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) 
{ 


    // 
    for transaction in transactions as [SKPaymentTransaction] 
    { 
     switch transaction.transactionState 
     { 
      case .purchasing: 
      print("Purchasing") 
      UIApplication.shared.isNetworkActivityIndicatorVisible = true 
      break 
      case .deferred: 
      print("Deferrred") 

      let alertController: UIAlertController = UIAlertController(title: "Deferred", message: "Purchase deferred", preferredStyle: .alert) 
      let dismiss = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil) 
      alertController.addAction(dismiss) 
      alertController.show() 
      UIApplication.shared.isNetworkActivityIndicatorVisible = false 
      break 
      case .failed: 
      print("Failed") 
      //print(transaction.error?.localizedDescription) 
      UIApplication.shared.isNetworkActivityIndicatorVisible = false 
      SKPaymentQueue.default().finishTransaction(transaction) 
      let alertController: UIAlertController = UIAlertController(title: "Failed", message: "Purchase failed", preferredStyle: .alert) 
      let dismiss = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil) 
      alertController.addAction(dismiss) 
      alertController.show() 
      //UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil) 
      break 
      case.purchased: 
      StopActivator() 
      print("Purchased") 
      self.verifyReceipt(transaction) 
      let thankyou = UserDefaults.standard.bool(forKey: "Purchased") 

      if thankyou == true 
      { 

       let alertController: UIAlertController = UIAlertController(title: "Thank You", message: "Purchase completed", preferredStyle: .alert) 
       let dismiss = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: { (action: UIAlertAction!) in 
       UIApplication.shared.keyWindow?.rootViewController?.dismiss(animated: true, completion: nil) 
       }) 
       alertController.addAction(dismiss) 
       alertController.show() 

      } 

      break 
      case .restored: 
      print("Restored") 
      let alertController: UIAlertController = UIAlertController(title: "Restore Success", message: "Your purchases have been restored", preferredStyle: .alert) 
      let dismiss = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil) 
      alertController.addAction(dismiss) 
      alertController.show() 
      break 

     } 
    } 
} 

写真上記のエラーのために:

First Image

Second Image

答えて

0

あなたはその何かにアクセスしようとすると、 "予期せずゼロ" エラーが発生存在しません。それで、あなたが与えたラインでは、IAPManager.sharedInstance.products?.object(at:0)になります。

これを追跡して、なぜそれが空であるかを調べる価値があります(私はそれにアクセスしようとすると値が必要だと考えます)。

+0

イエスダニー私はこれについて知っていますが、ユーザーがオフラインで情報を受け取らないため、インターネットが接続されているかどうかを確認するためにRechiabiltyクラスを使用するので、私は製品についての情報をチェックしません –