我正在订阅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,但在阅读时都会失败? –