2017-04-25 185 views
0

我正在訂閱IAP。我將所有購買項目設置完畢,細節恢復得很好,我可以在沙箱中購物並獲取所有消息。我現在的問題是檢查收據。我總是收到一個URL,但是當我嘗試閱讀它時,我總是收到文件不存在的錯誤。所以我試着用SKReceiptRefreshRequest刷新。再試一次,依然如此。收據驗證iOS - 文件無法打開,因爲沒有這樣的文件

我已經在模擬器和兩個真實設備上卸載應用程序,再次嘗試從新安裝和相同的問題。有一件事我意識到,其中一個真實的設備顯示密碼提示請求[Sandbox]提及。但經過兩次提示(包括接受密碼),而不是購買完成後,我得到一個「用戶/密碼不匹配」的消息。在模擬器上,當提示輸入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

所以你說什麼時候付款完成,我得到一個transaction.state的購買,我應該下載收據?我認爲收據會在購買時自動下載。即便如此,爲什麼SKReceiptRefreshRequest不起作用,並且每次分配一個appStoreReceiptURL,但在閱讀時都會失敗? –

0

雖然進一步研究,我發現下面的文章,它解決了這個問題

article

重要提示:如果您錯誤地使用沙盒測試帳戶登錄到生產環境中測試設備而不是您的測試環境,則沙箱帳戶將變爲無效,並且不能再次使用。如果發生這種情況,請用新的電子郵件地址創建一個新的沙盒測試人員帳戶。

相關問題