前段时间开发内购,踩了很多坑,发现网上教程大多是内购的代码,内购开发的代码不难,网上一搜一大片,填写协议、税务和银行业务的资料也一大片,我这里不讲这些,初次使用内购的同学可以网上自行查找,我主要奖内购类型的选择,每个类型在开发中需要注意的地方,已经坑爹的itunes connect 后台的产品添加和修改.话不多说,直接开始.
1:介绍支付类型的选择
1>消耗型
说的很明白,用一次,使用后失效,商品会在使用中一点一点消耗,这里最多使用的是游戏道具之类.游戏中内购大多使用这个,还有直播送礼物等等
2>非消耗型
这个非消耗型绝对是最最坑爹的一种,这个不依赖自己服务器,只和苹果appid联系,只要同一个id购买,即使100个设备同时用这个id登录,都不需要进行再次购买,而且苹果强制要求要有一个Restore Purchases button,这个按钮的主要作用是恢复之前的购买.(appstore上面收费软件的下载就是这种类型)
开发中有2种方案:
一种是直接在购买按钮下面添加一个恢复购买按钮(但是你要告诉审核人员,这个按钮在哪,发图片或者视频给审核人员,这种方便最简单,但是显示不好)
一种是通过获取该appid下面购买过的商品,然后在判断该商品是否在购买过的商品列表中,如果有,显示回复购买按钮,如果没有显示购买按钮.这个贴一段代码吧
`[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; if ([SKPaymentQueue canMakePayments]) { //用户允许app内购 if (productId.length) { NSArray *product = [[NSArray alloc] initWithObjects:@"商品id", nil]; NSSet *set = [NSSet setWithArray:product]; SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:set]; productRequest.delegate = self; [productRequest start]; } else { //商品id为空 } }else{ //不支持购买 } #pragma mark SKProductsRequestDelegate 查询成功后的回调 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { NSArray *product = response.products; if (product.count == 0) { //无法获取商品信息 }else{ //发起购买请求 SKPayment *payment = [SKPayment paymentWithProduct:product[0]]; [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];//这句代码就是恢复购买 } }`
接下来是代理函数,在这里你可以获取到已经购买过的商品集合
`- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions: (nonnull NSArray *)transactions { self.restoreArray = [[NSMutableArray alloc]init]; for (SKPaymentTransaction *transaction in transactions) { switch (transaction.transactionState) { case SKPaymentTransactionStatePurchasing://正在交易 break; case SKPaymentTransactionStatePurchased://交易完成 break; case SKPaymentTransactionStateFailed://交易失败 break; case SKPaymentTransactionStateRestored://已经购买过该商品 [self.restoreArray addObject:transaction.payment.productIdentifier]; [self restoreTransaction:transaction]; break; default: break; } } } - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { if ([self.restoreArray containsObject:self.goodsProductId]) { //用户购买过商品.就应该显示"恢复购买按钮" }else{ //用户没有购买过该商品 } } `
3>自动续期订阅
这种适合报刊订阅类型,使用很少,这里不做介绍
4>非续期订阅
这个是我们开发中用到的比较多的,可以依赖自已服务器,可以无数次购买,没有appid限制,
比如一个价格商品有很多种规格,就可以使用这个.比如网易云课堂的收费课,腾讯课堂收费课等等,我最后就选择了这个类型
2.itunes connect后台的坑爹
这些信息都填写后保存一下,不要提交审核,我是把商品审核和app的审核放在了一起.准备工作都做完之后,回到app提交审核的页面
最后:最近审核比较严格,内购的时候最好提供游客模式,即使用户没有登录,也能进行购买,不要在购买的时候,强行提示用户登录(本人因为这个被拒2次)
貌似内购的大体流程就是这样,第一次写博客,比较粗糙,有出错的地方希望大家指正