在iOS开发中如果涉及到虚拟物品的购买,就需要使用IAP服务,我们今天来看看如何实现。
在实现代码之前我们先做一些准备工作,一步步来看。
1、IAP流程
IAP流程分为两种,一种是直接使用Apple的服务器进行购买和验证,另一种就是自己假设服务器进行验证。由于国内网络连接Apple服务器验证非常慢,而且也为了防止黑客伪造购买凭证,通用做法是自己架设服务器进行验证。
下面我们通过图来看看两种方式的差别:
1.1、使用Apple服务器

1.2、自己架设服务器

简单说下第二中情况的流程:
- 用户进入购买虚拟物品页面,App从后台服务器获取产品列表然后显示给用户
- 用户点击购买购买某一个虚拟物品,APP就发送该虚拟物品的productionIdentifier到Apple服务器
- Apple服务器根据APP发送过来的productionIdentifier返回相应的物品的信息(描述,价格等)
- 用户点击确认键购买该物品,购买请求发送到Apple服务器
- Apple服务器完成购买后,返回用户一个完成购买的凭证
- APP发送这个凭证到后台服务器验证
- 后台服务器把这个凭证发送到Apple验证,Apple返回一个字段给后台服务器表明该凭证是否有效
- 后台服务器把验证结果在发送到APP,APP根据验证结果做相应的处理
2、iTunes Connet操作
搞清楚了自己架设服务器是如何完成IAP购买的流程了之后,我们下一步就是登录到iTunes Connet创建应用和指定虚拟物品价格表
2.1、创建自己的App
如下图所示,我们需要创建一个自己的APP,要注意的是这里的Bundle ID一定要跟你的项目中的info.plist中的Bundle ID保证一致。也就是图中红框部分。

2.2、创建虚拟物品价格表
2.2.1、虚拟物品分为如下几种:
-
消耗品(Consumable products):比如游戏内金币等。
-
不可消耗品(Non-consumable products):简单来说就是一次购买,终身可用(用户可随时从App Store restore)。
-
自动更新订阅品(Auto-renewable subscriptions):和不可消耗品的不同点是有失效时间。比如一整年的付费周刊。在这种模式下,开发者定期投递内容,用户在订阅期内随时可以访问这些内容。订阅快要过期时,系统将自动更新订阅(如果用户同意)。
-
非自动更新订阅品(Non-renewable subscriptions):一般使用场景是从用户从IAP购买后,购买信息存放在自己的开发者服务器上。失效日期/可用是由开发者服务器自行控制的,而非由App Store控制,这一点与自动更新订阅品有差异。
-
免费订阅品(Free subscriptions):在Newsstand中放置免费订阅的一种方式。免费订阅永不过期。只能用于Newsstand-enabled apps。
类型2、3、5都是以Apple ID为粒度的。比如小张有三个iPad,有一个Apple ID购买了不可消耗品,则三个iPad上都可以使用。
类型1、4一般来说则是现买现用。如果开发者自己想做更多控制,一般选4
2.2.2、创建成功后如下所示:

其中产品id是字母或者数字,或者两者的组合,用于唯一表示该虚拟物品,app也是通过请求产品id来从apple服务器获取虚拟物品信息的。
2.3、设置税务和银行卡信息
这一步必须设置,不然是无法从apple获取虚拟产品信息。
设置成功后如下所示:

更多关于iTunes Connet的操作请才看这篇博文http://openfibers.github.io/blog/2015/02/28/in-app-purchase-walk-through/
3、iOS端具体代码实现
完成了上面的准备工作,我们就可以开始着手IAP的代码实现了。
我们假设你已经完成了从后台服务器获取虚拟物品列表这一步操作了,这一步后台服务器还会返回每个虚拟物品所对应的productionIdentifier,假设你也获取到了,并保存在属性self.productIdent中。
需要在工程中引入 storekit.framework。
我们来看看后续如何实现IAP
3.1、确认用户是否允许IAP
//移除监听
-(void)dealloc
{
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}