确保iOS应用程序和后端之间的通信成功



简单的问题:如何确保iOS应用程序和后端之间的通信成功?


详细信息:对于我们移动应用程序中的大多数API调用,如果应用程序和服务器之间的通信失败(由于网络原因或其他原因(,则可以"正常",例如,我们可以通过重试按钮向用户显示消息以重新加载他的新闻或帖子提要。

然而,在某些情况下,我们希望真正确信应用程序和后端之间的通信永远不会失败,并且这种通信的数据可能会"丢失"。

为此,让我们以应用内购买(IAP(:为例

  • 在我的应用程序中,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 
}
  • 每次用户进行购买时,我都想将此信息发送到后端,以便在我的应用程序中保存购买的历史记录
  • 我不想错过应用程序和服务器之间的任何通信(如果用户向我发送反馈,说他在我的应用程序中购买了一些商品,我想通过查看历史记录来确保他真的进行了购买(
  • 如果购买成功,但向服务器发送信息的呼叫失败(网络错误或其他(,则此信息不会丢失,必须尽快发送

我想到了这种方法:

  • 使用UserDefaultKeychain创建一个挂起的购买数组
var pendingPurchases = [InAppPurchase]()
  • 当用户购买商品时,该商品将存储在pendingPurchases数组中。

  • 应用程序通过发送此IAP 阵列与后端通信

  • 如果我从后端收到答案代码200 SUCCESS,我可以清除pendingPurchases阵列。

  • 如果我收到错误的另一个代码,我会尝试在另一个时间发送此调用(限制为连续3次,如果是因为网络不好,可能目前不需要无限期地尝试发送请求(,直到收到200 SUCCESS

  • 每次打开应用程序或从后台切换到前台时,我都会检查pendingPurchases是否为空。如果不是空的,我会将请求发送到服务器。


你觉得这种方法怎么样?你如何管理这种你不想"丢失"的数据?

您要做的是等待"完成事务",直到收到来自服务器的200响应。如果你没有完成交易,苹果会将其保存在支付队列中,并在每次应用程序启动时不断发送给你。这将使您有机会在需要时处理对服务器的任何重试。

完成交易告诉StoreKit您已经完成购买所需的一切。未完成的交易记录保留在队列,直到它们完成,以及事务队列观察器每次启动应用程序时都会调用,以便您的应用程序可以完成交易。你的应用程序需要完成每一笔交易事务是成功还是失败。

在完成之前,请完成以下所有操作交易:

  • 坚持购买
  • 下载相关内容
  • 更新应用程序的UI以允许用户访问产品

若要完成交易,请调用支付队列上的finishTransaction:方法。

SKPaymentTransaction *transaction = <# The current payment #>;
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];

你可以在下面的苹果文档中阅读更多关于完成交易的信息:https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html

最新更新