Swift 如果iOS购买验证失败怎么办?

Swift 如果iOS购买验证失败怎么办?,swift,in-app-purchase,Swift,In App Purchase,我和这篇文章有同样的问题: 我已经阅读了文章中的解决方案,但我仍然有几个问题 他说如果在第1步到第5步之间出现任何问题,你的应用程序仍然可以访问SKPaymentQueue中的交易,并且可以“重新处理”它。 据我所知,SKPaymentQueue将保存与UserDefault类似的事务,不是吗 那么,如果我删除我的应用程序呢?我是否丢失了应用程序事务?SKPaymentQueue不会将任何事务保存到您的用户默认值。但是,除了消费品之外,所有东西都会保存到应用商店收据中。若第5步并没有完成,你们

我和这篇文章有同样的问题:

我已经阅读了文章中的解决方案,但我仍然有几个问题

他说
如果在第1步到第5步之间出现任何问题,你的应用程序仍然可以访问SKPaymentQueue中的交易,并且可以“重新处理”它。
据我所知,SKPaymentQueue将保存与UserDefault类似的事务,不是吗


那么,如果我删除我的应用程序呢?我是否丢失了应用程序事务?

SKPaymentQueue不会将任何事务保存到您的用户默认值。但是,除了消费品之外,所有东西都会保存到应用商店收据中。若第5步并没有完成,你们可以随时尝试验证苹果的收据,因为收据存储在设备上,并且在你们重新安装应用程序时会被重新安装

您是否使用任何处理付款流程的库?采购的基本流程如下所示:


func makePurchase(产品:SKProduct){
let payment=SKPayment(产品:产品)
SKPaymentQueue.default().add(付款)
}
func paymentQueue(queue:SKPaymentQueue,updatedTransactions事务:[SKPaymentTransaction]){
交易中的交易{
开关(transaction.transactionState){
案例。购买:
SKPaymentQueue.default().finishTransaction(事务)
手购
打破
案例。失败:
SKPaymentQueue.default().finishTransaction(事务)
打破
案件.恢复:
SKPaymentQueue.default().finishTransaction(事务)
手购
打破
案例.延期采购:
打破
违约:
打破
}
}
}
func handlePurchased(){
guard let receiptUrl=Bundle.main.appStoreReceiptURL else{
//使用SKReceiptRefreshRequest刷新收据
回来
}
#如果调试
让URL字符串=”https://sandbox.itunes.apple.com/verifyReceipt"
#否则
让URL字符串=”https://buy.itunes.apple.com/verifyReceipt"
#恩迪夫
让receiptData=try?Data(contentsOf:receiptUrl).base64EncodedString()
让requestData=[“收据数据”:receiptData??,“密码”:“您的共享秘密”,“排除旧交易”:true]作为[字符串:任意]
var request=URLRequest(url:url(string:urlString)!)
request.httpMethod=“POST”
request.setValue(“Application/json”,forHTTPHeaderField:“Content Type”)
让httpBody=try?JSONSerialization.data(使用jsonObject:requestData,选项:[])
request.httpBody=httpBody
URLSession.shared.dataTask(带:请求){(数据、响应、错误)在
DispatchQueue.main.async{
如果data!=nil,则让json=try?JSONSerialization.jsonObject(带:data!,选项:.allowFragments){
//在此处解析您的收据数据,获取订阅的过期日期或任何应用程序类型。
}否则{
//验证收据时出错。
//您可以要求用户还原已完成的事务。
//或自动恢复
//但请确保不要进行无限循环
}
}
}1.简历()
}
您可以在此处获得有关付款流程和收据验证的完整文章:


我是这个博客的作者。这是关于自动续费订阅,但购买和验证过程是相同的。

“我了解的是,SKPaymentQueue将保存与UserDefault类似的事务,不是吗”不,你为什么这么说?付款队列没有在磁盘上存储任何东西。因此,如果我验证购买失败,例如,由于网络连接,我的连接丢失了大约1天,我如何在第二天重新处理它?好吧,根据你引用的来源(),它仍然在队列中,除非你清除它。是的,但我想知道如果我删除我的应用程序,它仍然在队列中吗?我理解这一点,但这与错误的想法无关,即它以UserDefaults的方式保存事务。事实上,我还没有高级帐户,所以我只是在看文件