我正在訂閱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
爲什麼我無法獲得創建或找到的收據?這是一個設備問題,一個錯誤還是我忘記了什麼?
所以你說什麼時候付款完成,我得到一個transaction.state的購買,我應該下載收據?我認爲收據會在購買時自動下載。即便如此,爲什麼SKReceiptRefreshRequest不起作用,並且每次分配一個appStoreReceiptURL,但在閱讀時都會失敗? –