2016-11-20 5 views
0

안녕하세요 알 것을 제외하고(스위프트)

: 나는 사용자의 인터넷 연결 여부를하지만,이 경우 클래스가 인터넷을 확인하지만 난 해달라고 여부를 확인하기 위해 Rechibility 클래스를 사용 사과에서 정보를 받으십시오.

1 : 그냥 내가 지불 시스템을 생성하고 잘 작동

이 경우 그러나이다가 충돌하는 경우가 있습니다 사용자가 인터넷에 연결하지 않고 응용 프로그램을 입력 (와이파이 또는 4G) 2 : 사용자가 오프라인으로 앱을 구매하여 구매보기 컨트롤러로 들어갑니다. 3 : iPhone 홈 버튼을 누른 다음 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 클래스를 사용하므로 제품에 대한 정보를 확인할 때 돌아 가지 않습니다. –