私はサブスクリプション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
なぜ領収書を作成できないのですか?それはデバイスの問題、バグですか、何か気付かないのですか?
支払いが完了して取引が行われると言っています。購入済みの領収書をダウンロードする必要がありますか?私は領収書が購入時点で自動的にダウンロードされると思った。それでも、なぜSKReceiptRefreshRequestは機能せず、appStoreReceiptURLを割り当てるたびに読み込み時に失敗するのですか? –