2017-11-20 1 views
0

SKPaymentTransactionObserver.paymentQueue : updatedTransactions는 트랜잭션 배열을 반환합니다. 지불 할 때 지불 한 거래는 어떻게 알 수 있습니까? 결제 할 때 항상 하나의 거래가 반환됩니까?iOS IAP paymentQueue : updatedTransactions

한편이 옵저버 함수는 트랜잭션을 복원 할 때도 호출됩니다. 따라서 updatedTransactions를 처리하는 가장 좋은 방법은 무엇입니까?

동의, 내 구독 제품은 자동 갱신 구독입니다.

+0

그냥 프로세스를 모든 거래 내가 하나가되는 알고하는 방법, 동일 제품의 경우 자신의 트랜잭션 상태 – Paulw11

답변

0

트랜잭션 루프를 반복하고 각 트랜잭션을 확인하십시오.

public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 
     for transaction in transactions { 
      switch (transaction.transactionState) { 
      case .purchased: 
       completeTransaction(transaction: transaction) 
       break 
      case .failed: 
       failedTransaction(transaction: transaction) 
       break 
      case .restored: 
       restoreTransaction(transaction: transaction) 
       break 
      case .deferred: 
       // TODO show user that is waiting for approval 

       break 
      case .purchasing: 
       break 
      } 
     } 
    } 

    private func completeTransaction(transaction: SKPaymentTransaction) { 

     print("completeTransaction...") 

     deliverPurchaseForIdentifier(identifier: transaction.payment.productIdentifier) 
     SKPaymentQueue.default().finishTransaction(transaction) 

    } 

    private func restoreTransaction(transaction: SKPaymentTransaction) { 


     guard let productIdentifier = transaction.original?.payment.productIdentifier else { return } 

     print("restoreTransaction... \(productIdentifier)") 


     deliverPurchaseForIdentifier(identifier: productIdentifier) 
     SKPaymentQueue.default().finishTransaction(transaction) 
    } 

    private func failedTransaction(transaction: SKPaymentTransaction) { 

     if let error = transaction.error as NSError? { 
      if error.domain == SKErrorDomain { 
       // handle all possible errors 
       switch (error.code) { 
       case SKError.unknown.rawValue: 
        print("Unknown error") 

        BaseViewController.currentViewController?.Alert(title: MFErrors.purchaseFaild.messgae.title, msg: MFErrors.purchaseFaild.messgae.body) 

       case SKError.clientInvalid.rawValue: 
        print("client is not allowed to issue the request") 

        BaseViewController.currentViewController?.Alert(title: MFErrors.accountNotAllowedToMakePurchase.messgae.title, msg: MFErrors.accountNotAllowedToMakePurchase.messgae.body) 

       case SKError.paymentCancelled.rawValue: 
        print("user cancelled the request") 

       case SKError.paymentInvalid.rawValue: 
        print("purchase identifier was invalid") 

       case SKError.paymentNotAllowed.rawValue: 
        print("this device is not allowed to make the payment") 
        BaseViewController.currentViewController?.Alert(title: MFErrors.purchaseFaild.messgae.title, msg: MFErrors.purchaseFaild.messgae.body) 
       default: 
        break; 
       } 
      } 

      ProgressViewManager.shared.hide() 
     } 

     SKPaymentQueue.default().finishTransaction(transaction) 
    } 

    private func deliverPurchaseForIdentifier(identifier: String?) { 

     guard let identifier = identifier else { return } 

     //Check if this transactions is a subscription 
     //SubscriptionsProductIdentifiers is an array of subscriptions product ids you sent to the app store to get SKProducts 

     //If subscription 
     if SubscriptionsProductIdentifiers.contains(identifier) { 


     }else{ 
      //If non-consumable, consumables etc... 

     } 


    } 

여기에 전체 매장 관리자는 내 이전의 대답입니다 : How to handle shouldAddStorePayment for In-App Purchases in iOS 11?

+0

에 거래 기반의 모든 최근? 그리고 내가 지금 막 지불 한 지불금은 어느 것입니까? – jarly

+0

먼저 사용자가 구입하기로 결정한 제품 ID를 저장할 수 있습니다. 그런 다음 위의 예에서 저장된 제품 ID와 식별자를 비교하여 어떤 제품인지 알 수 있지만 충분하지 않아서 유효성 검사를 위해 영수증을 보내야합니다. Apple 서버는 JSON으로 디코딩 된 영수증을 받고 구매 날짜 및 만료 날짜 등 각 구독에 대한 모든 정보를 가지고 있습니다. – Jad

관련 문제