代码之家  ›  专栏  ›  技术社区  ›  Florian Ldt

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

  •  0
  • Florian Ldt  · 技术社区  · 6 年前

    简单问题: 如何确保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 
    }
    
    • 每次用户进行购买时,我都要将此信息发送到后端,以便保存在应用程序中进行的购买的历史记录。
    • 我不想错过应用程序和服务器之间的任何通信(如果用户向我发送反馈说他在我的应用程序中支付了某些项目的费用,我想通过检查历史来确保他真正购买了这些项目)
    • 如果购买成功,但向服务器发送信息的调用失败(网络错误或其他),则此信息不会丢失,必须尽快发送。

    我在考虑这种方法:

    • 使用创建挂起的采购数组 UserDefault Keychain 像这样
    var pendingPurchases = [InAppPurchase]()
    
    • 当用户购买项目时,此项目存储在 pendingPurchases 数组。

    • 应用程序通过发送此IAP数组与后端通信

    • 如果我收到应答码 200 SUCCESS 从后端,我可以清除 待决采购 数组。

    • 如果我收到另一个错误代码,我会尝试再次发送此呼叫(限制为连续3次,如果是因为网络不好,可能此时不需要尝试无限期发送请求),直到收到 200成功

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


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

    1 回复  |  直到 6 年前
        1
  •  0
  •   enc_life    6 年前

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

    完成一个事务会告诉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