一个简单的问题:如何确保iOS应用程序与后端之间的通信成功?
详细信息:对于我们的移动应用程序中的大多数API调用,如果应用程序与服务器之间的通信失败(由于网络原因或其他原因),则可以为“ OK”。通过重试按钮向用户显示一条消息,以重新加载其新闻或发布供稿。
但是,在某些情况下,我们要真正确信应用程序和后端之间的通信将永远不会失败,并且该通信的数据可能会“丢失”。
为此,我们以应用内购买(IAP)为例:
struct InAppPurchase{
// The id of the purchase
let transactionId: String
// The id of the user who purchased
let userId: String
// The IAP product involved in the purchase (10 or 30 in-app coins for example)
let productId: String
}
我正在考虑这种方法:
UserDefault
或Keychain
创建待定购买数组var pendingPurchases = [InAppPurchase]()
用户购买商品时,该商品存储在pendingPurchases
数组中。
应用程序通过发送此IAP数组与后端进行通信
如果我从后端收到答案代码200 SUCCESS
,则可以清除pendingPurchases
数组。
如果我收到另一个错误代码,则尝试再次发送该调用(限制为连续3次,如果是由于网络故障,则可能不需要无限期尝试发送请求)此刻),直到收到200 SUCCESS
每次打开应用程序或从后台切换到前台时,我都会检查pendingPurchases
是否为空。如果不为空,则将请求发送到服务器。
您如何看待这种方法?您如何管理这种不想“丢失”的数据?
答案 0 :(得分:0)
您要做的是等待“完成交易”,直到您收到服务器发出的200
响应。如果您没有完成交易,Apple会将其保存在付款队列中,并在每次启动应用程序时继续将其发送给您。如果需要,这将为您提供处理服务器重试的机会。
完成交易会告诉StoreKit您已经完成 购买所需的一切。未完成的交易保留在 队列直到完成,还有事务队列观察器 每次您的应用启动时都会被调用,以便您的应用可以完成 交易。您的应用程序需要完成每笔交易,无论 交易是成功还是失败。
完成以下所有操作,然后再完成 交易:
- 坚持购买。
- 下载相关内容。
- 更新应用的用户界面,以使用户可以访问产品。
要完成交易,请在付款队列上调用finishTransaction:方法。
SKPaymentTransaction *transaction = <# The current payment #>;
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
您可以在下面的Apple文档中阅读有关完成交易的更多信息: https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html