2017-12-30 28 views
0

샌드 박스 환경에서 작동하지만 앱 스토어 버전의 인앱 구매는 사용자 계정에서 인출되지만 콘텐츠는 잠금 해제되지 않습니다.iOS- 앱 구매시 샌드 박스 환경에서 제대로 작동 함, 앱 스토어 버전 콘텐츠가 잠금 해제되지 않음

코딩에 문제가 있다고 생각하지 않습니다. 그렇지 않으면 샌드 박스 환경에서 작동하지 않습니다. 거래 영수증이 무효라고 생각할 수 있습니다.

다시 구입하려면 "이미 가입하셨습니다"라는 메시지가 나타납니다. 하지만 여전히 앱 콘텐츠를 잠금 해제하지는 않습니다. 심지어 구입을 복원하기 위해 클릭했지만 작동하지 않습니다. 나는 모든 것이 샌드 박스 환경에서 작동하는 것에 놀랐다.

구독 유형 : 자동 재생 가능. 콘텐츠 잠금 해제 : 오디오, 비디오 및 pdf 자습서.
백엔드 로그를 확인했습니다. API가 실행 된 적이없고 내가 채울 수있는 유일한 문제는 사용자가 성공적으로 구매 한 경우에도 앱 스토어 영수증을받지 못했다는 것입니다. 모든 것이 샌드 박스 환경에서 완벽하게 작동합니다.

코드 : 당신이 영수증 queue.finishTransaction (트랜잭션)를 확인 후

public func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { 

     for transaction in transactions { 

      switch transaction.transactionState { 
      case .purchasing: 
       handlePurchasingState(for: transaction, in: queue) 
      case .purchased: 
       handlePurchasedState(for: transaction, in: queue) 
      case .restored: 
       handleRestoredState(for: transaction, queue: queue) 
      case .failed: 
       handleFailedState(for: transaction, in: queue) 
      case .deferred: 
       handleDeferredState(for: transaction, in: queue) 
      } 
     } 
    } 

//On transaction state changed to purchased: 
func handlePurchasedState(for transaction: SKPaymentTransaction, in queue: SKPaymentQueue) { 
     print("User purchased product id: \(transaction.payment.productIdentifier)") 
     print("User purchased product id: \(transaction)") 
     queue.finishTransaction(transaction) 
     self.completeTransaction(transaction:transaction) 
    } 

//In completeTransaction Method: 
func completeTransaction(transaction:SKPaymentTransaction) 
    { 
     if let receiptURL = Bundle.main.appStoreReceiptURL,FileManager.default.fileExists(atPath: receiptURL.path) 
     { 
      let receipt:Data = try! Data(contentsOf: receiptURL) 
      let jsonObjectString = receipt.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0)) 
      var strIdentifier:String = transaction.transactionIdentifier! 

      if let identifier = transaction.original?.transactionIdentifier 
      { 
       strIdentifier = identifier 
      } 

     //API call to save receipt to validate later and unlock the content 
     //In case API calling failed then I stored data and called API again on app home page. 
     } 
    } 
+1

우리는 자세한 내용을 필요하다 IAP의 유형이, 어떤 유형의 콘텐츠가 잠금 해제하고 코드를 게시 할 수 있습니다. 일반적으로 콘텐츠 잠금 해제는 앱의 책임이므로 코딩 문제는 배제하지 않을 것입니다. –

+0

당신이 물어 본 질문을 편집했습니다. 확인해주십시오. 감사. – Vicky

+0

[이 질문에 대한 답변] (https://stackoverflow.com/q/20027322/2466193)의 답변에 설명 된대로 refreshReceiptRequest를 사용하여 영수증을 새로 고침 해 보았습니다 –

답변