文档章节

iOS应用内购买优化

Charly张
 Charly张
发布于 2016/02/02 15:14
字数 1212
阅读 79
收藏 1

之前写的一个iOS应用内购买模块的开发有很多地方需要考虑优化,其中最主要的是App意外结束网络连接断开。应用内购买比较缓慢,再加上购买后需要请求Server更新数据库以及Server进行二次验证,整个过程时间比较长,对于可能发生的意外需要慎重考虑。

接下来以Web调用IAP模块进行虚拟币购买为例说明

处理概览

整个处理过程可分为下图几部分,其中主要关注的是:

  • Client向App Store交易虚拟币购买
  • Client请求Server更新余额 虚拟币充值总流程图

App意外结束

  • Client向App Store交易虚拟币购买 这个阶段主要通过Apple提供的StoreKit框架来处理,交易从addPayment开始,至finishTransaction结束。需要注意的是在结束之前,payment一直处于队列中,并且监听器的代理函数`updatedTransactions`会被反复调用。这样就方便我们处理这个阶段中App意外结束的情况了,只要:

    1. finishTransaction之前处理IAP交易成功后的后续工作(更新Server余额等);
      • 待后续工作启动后才会将交易从队列中移除,这能保证后续工作总能启动,可也会带来App重启时重复启动后续工作的问题,这个可以用后面讨论的重传机制规避。
    	/// send request to Server
    	...
    
    	[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
    
    1. 在App启动之时就添加交易监听器(SKPaymentTransactionObserver
      • 我将添加交易监听器的处理移到了AppDelegate的didFinishLaunchingWithOptions函数中,使得App启动后就能处理先前意外结束留在队列中的交易。
      • 这里推荐一篇好文In-App Purchase Best Practices,这Best可是Apple官方说的。中文翻译在此
      • 为了保证App在重启时能处理意外结束的交易,我重构了代码: 重构前交易处理的依赖

之前的交易处理中,监听器IAPObserver通过Block调用IAPViewController来做IAP交易完成后的处理工作,它们之间是强依赖关系。 这样的问题是:重启时IAPViewController还没有创建,此时监听到的未完成交易无法启动后续处理工作。 考虑到: 1. 后续处理工作主要是与Server的交互,可以独立成新的类; 2. 采用NSNotification的方式可以弱化耦合,也可以实现一对多的关联 于是我将代码改成下面的样子: 重构后交易处理的依赖

更新Server的工作封装成单例ServerManager,和IAPViewController一样,都接收来自IAPObserver的消息,完成IAP交易成功后的工作。同时ServerManager会发送通知给IAPViewController,告知工作完成情况,由其来展示UI和通知调用者;当IAPViewController没有创建时,并不会影响Client请求Server更新的操作。

  • Client请求Server更新余额 这个阶段由Client向Server发更新余额请求。为了应对可能出现的App结束,可以设立重传机制,具体来说:
    1. 先将请求数据本地化存储,再发起请求;
    2. 只有服务器正确返回且返回的是更新成功/更新重复/二次验证失败等情况时才移除本地存储的请求数据;
    3. App启动发起虚拟币充值网络连接恢复 时检查是否存在本地请求数据,如果存在则再次请求。

设立重传机制还可以应对网络连接断开出现的问题。

网络连接断开

网络连接断开处理首要是保证交易的一致性,即请求App Store购买虚拟币成功后也要成功更新Server虚拟币信息。Client分以下几个阶段考虑:

  1. 虚拟币充值发起前
  • 不作特别处理
  1. 与App Store进行虚拟币购买
  • 不作特别处理
  1. 发送更新虚拟币余额请求到Server前
  • 本地存储相关信息,下次再请求,确定成功更新Server的余额后删除
  1. 收到Server的返回信息前
  • 本地存储相关信息,下次再请求,确定成功更新Server的余额后删除

详细处理流程如下图: Client进行虚拟币充值的处理

至于Server与App Store进行二次验证时发生的网络断开,这里不讨论。

Demo

GitHub上的代码库,有处理不当的地方,欢迎提Issues。

© 著作权归作者所有

Charly张
粉丝 8
博文 22
码字总数 15101
作品 0
海淀
程序员
私信 提问
OSC 第 76 期高手问答 — iOS 性能优化&数据持久化

OSCHINA 本期高手问答 ( 5月27日- 6月2日) 我们请来了@智捷课堂(关东升)为大家解答关于 iOS 性能优化和数据持久化 方面的问题。 关东升,智捷课堂创始人,国内知名 iOS 技术作家,iOS 技术...

叶秀兰
2015/05/27
4.1K
27
Xamarin iOS 7.9.0 发布,初步支持 iOS 8 beta2

Xamarin iOS 7.9.0 发布,初步支持即将到来的 iOS 8。其他改进如下: iOS Designer support: you will need to update Xamarin Studio and Visual Studio to their Alpha components to be a......

oschina
2014/06/20
2.9K
5
苹果 App Store 申请和管理相关知识

app store为开发者提供四种类型的申请: 个人ios开发者计划$99/年 公司ios开发者计划$99/年 企业ios开发者计划$299/年 高校ios开发者计划免费 在这里主要介绍一下公司ios开发者计划,只有利用...

鉴客
2012/01/09
50.8K
4
Xamarin 2.0 发布,用 C# 开发移动应用

Xamarin 2.0 引入了 Xamarin Studio,这是一个使用 C# 来开发跨平台应用的集成开发环境,紧密集成了 iOS 和 Android SDK: 此外 2.0 版本还包含预构建的应用组件,支持在 Visual Studio 上使...

oschina
2013/02/21
5.9K
39
Xamarin 3 发布,C# 的移动应用开发框架

Xamarin 3 发布,Xamarin的产品简化了针对多种平台的应用开发,包括iOS和 Android。Xamarin由许多著名的开源社区开发者创立和参与,而且也是Mono项目的主导者——C#与.NET框架的开源、跨平台...

oschina
2014/05/29
2.5K
11

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部