2016-11-20 2 views
0

Добрый день аль(Swift) In-App Purchase Wi-Fi Ошибка

Obs: Я использую класс Rechibility, чтобы проверить, если интернет-пользователь подключен или нет, но в этом случае класс проверить интернет, но я не получать информацию от яблока. Только в этом случае

Я создал платежную систему, и она прекрасно работает, однако есть случай, что происходит сбой, который:

1: Пользователь вводит приложение без подключения к интернету (Wi-Fi или 4G) 2: Пользователь пытается купить приложение в автономном режиме и попадает в контроллер view view . 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

Yep Danny Я знаю об этом, но очень странно, потому что пользователь офлайн не получает информацию, поэтому я использую класс Rechiabilty, чтобы проверить, подключен ли интернет, но когда я проверяю информацию о продуктах, не возвращаю –