2017-04-25 6 views
0

私はサブスクリプションIAPで作業しています。私はすべての購入を設定し、その詳細がうまく戻ってきます。私はサンドボックスで購入を行い、すべてのメッセージをきちんと受け取ります。私が今問題になっているのは領収書をチェックすることです。私はいつも正しいURLを返しますが、私がそれを読み込もうとすると、ファイルが存在しないというエラーが出ます。ですから、私はSKReceiptRefreshRequestで試してリフレッシュします。それでもやり直してください。受領確認iOS - そのようなファイルがないためファイルを開くことができませんでした

私はシミュレータと2つの実際のデバイスでアプリケーションをアンインストールしましたが、新しいインストールと同じ問題から再試行してください。私が実現したことの一つは、実際のデバイスの1つが、[サンドボックス]の言及とともにパスワードプロンプトの要求を表示することです。しかし、2回のプロンプト(パスワードの受け入れを含む)の後、購入の代わりに「ユーザー/パスワードが一致しません」というメッセージが表示されます。シミュレータでは、iTunesのアカウントとパスワードの入力を求められますが、実際の購入確認は決してありません(私は4分、安定したインターネット接続を待っていました)。

これは、検証プロセスでは、

let receiptURL = Bundle.main.appStoreReceiptURL 
func receiptValidation() { 
    print("1") 
     print("2", receiptURL) 
     do { 
      print("3") 
      let receiptData = try Data(contentsOf: receiptURL!, options: .alwaysMapped) 
      print(receiptData) 
      let receiptString = receiptData.base64EncodedString(options: []) 
      let dict = ["receipt-data" : receiptString, "password" : "\(password)"] as [String : Any] 

      do { 
       print("4") 
       let jsonData = try JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) 

       if let sandboxURL = Foundation.URL(string:"https://sandbox.itunes.apple.com/verifyReceipt") { 
        print("5") 
        var request = URLRequest(url: sandboxURL) 
        request.httpMethod = "POST" 
        request.httpBody = jsonData 
        let session = URLSession(configuration: URLSessionConfiguration.default) 
        let task = session.dataTask(with: request) { data, response, error in 
         print("6") 
         if let receivedData = data, 
          let httpResponse = response as? HTTPURLResponse, 
          error == nil, 
          httpResponse.statusCode == 200 { 
          print("7") 
          do { 
           print("8") 
           if let jsonResponse = try JSONSerialization.jsonObject(with: receivedData, options: JSONSerialization.ReadingOptions.mutableContainers) as? Dictionary<String, AnyObject> { 
            print(jsonResponse, jsonResponse.count) 
            // parse and verify the required informatin in the jsonResponse 

           } else { print("Failed to cast serialized JSON to Dictionary<String, AnyObject>") } 
          } 
          catch { print("Couldn't serialize JSON with error: " + error.localizedDescription) } 
         } 
        } 
        print("51") 
        task.resume() 
       } else { print("Couldn't convert string into URL. Check for special characters.") } 
      } 
      catch { print("Couldn't create JSON with error: " + error.localizedDescription) } 
     } 
     catch { 
      let appReceiptRefreshRequest = SKReceiptRefreshRequest(receiptProperties: nil) 
      appReceiptRefreshRequest.delegate = self 
      appReceiptRefreshRequest.start() 
      print("Couldn't read receipt data with error: " + error.localizedDescription) } 
    } 

func requestDidFinish(_ request: SKRequest) { 
    print("???") 
    do { 
     let receipt = try Data(contentsOf: receiptURL!) //force unwrap is safe here, control can't land here if receiptURL is nil 
     print(receipt) 
    } catch { 
     print("WTF NO RECEIPT") 
     // still no receipt, possible but unlikely to occur since this is the "success" delegate method 
    } 
} 

そして、このアプリを実行しているからデバッグ出力である(私は別のチュートリアルや他の人の問題から、かなりの数回それを変更しました)。 receiptURLはシミュレータ/実デバイス間で異なりますが、それ以外はすべて同じです。

1 
2 Optional(file:///Users/apple/Library/Developer/CoreSimulator/Devices/47EA3293-9B13-4808-BD0B-13D884D14BFE/data/Containers/Data/Application/2F1B7E4E-C523-4270-BF46-6D77F7A2220C/StoreKit/receipt) 
3 
Couldn't read receipt data with error: The file “receipt” couldn’t be opened because there is no such file. 
??? 
WTF NO RECEIPT 
??? 
WTF NO RECEIPT 

なぜ領収書を作成できないのですか?それはデバイスの問題、バグですか、何か気付かないのですか?

答えて

1

IAPプロセス全体が非同期で動作するため、プロセス全体が正常に完了しない限り、領収書データは受信されません。上記の質問に貼り付けた内容に基づいてコード全体を見ることはできませんが、ボタンやそれに類するもののアクションですぐに領収書データにアクセスしようとすると、そのコードは取得できません。

領収書データにアクセスする正しい方法は、IAP要求の成功完了ハンドラコールバックに基づいて領収書にアクセスすることです。 IAPリクエストを提出すると、IAPの処理を担当するサーバー側プロセスがあり、IAP SKPaymentTransactionObserverクラスからのコールバックハンドラがトリガされます。このクラスの通知ハンドラを使用して、ViewControllerに更新を送信してレシートデータをチェックすることができます。

+0

支払いが完了して取引が行われると言っています。購入済みの領収書をダウンロードする必要がありますか?私は領収書が購入時点で自動的にダウンロードされると思った。それでも、なぜSKReceiptRefreshRequestは機能せず、appStoreReceiptURLを割り当てるたびに読み込み時に失敗するのですか? –

0

はさらに再探索しながら、私は問題を解決し、以下の記事を発見した

article

重要:あなたが誤ってあなたのテストに本番環境へのログインにサンドボックステスターアカウントを使用している場合デバイスの代わりに使用すると、サンドボックスアカウントは無効になり、再度使用することはできません。このような場合は、新しいメールアドレスを使用して新しいサンドボックステスターアカウントを作成します。

関連する問題