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

时间:2018-12-17 03:12:24

标签: ios nsuserdefaults keychain

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


详细信息:对于我们的移动应用程序中的大多数API调用,如果应用程序与服务器之间的通信失败(由于网络原因或其他原因),则可以为“ OK”。通过重试按钮向用户显示一条消息,以重新加载其新闻或发布供稿。

但是,在某些情况下,我们要真正确信应用程序和后端之间的通信将永远不会失败,并且该通信的数据可能会“丢失”。

为此,我们以应用内购买(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是否为空。如果不为空,则将请求发送到服务器。


您如何看待这种方法?您如何管理这种不想“丢失”的数据?

1 个答案:

答案 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