iOS应用内付费(In-App Purchase,IAP,内购)实现要点总结

在iOS实现内购,需要接入StoreKit framework以完成玩家支付。为了保证支付的安全性,在玩家支付后,游戏并不是立即下发虚拟物品,而是拿着StoreKit从App Store收到的receipt(票据,可以理解为买东西付钱后开的发票),通过本地或者服务器向App Store发起验证,确认交易的合法性后,再发放游戏商品或者解锁游戏特性。

接入StoreKit之前的准备工作

在App Store Connect配置内购物品的Product ID

共有4种内购类型可供选择,其中常用的有两种:

  1. Consumables ,可消耗的,也就是玩家在游戏里可以装备或者花掉的,比如金币,装备,皮肤等。它是可以被玩家重复购买的,且只针对当前购买的设备有效。换句话说我在A设备上买的金币是不能再B设备上花的。
  2. Non-consumables,不可消耗的,也就是玩家只要买一次就能永久有效的,比如开启关卡,移除广告等。这种购买是在玩家所有设备上都有效的。总不能我再A设备上移除广告,换了B设备,就又要再次移除广告。
    注意:如果是按时间收费的内购,应该设置为Non-Renewing Subscription(不可更新的订阅),否则审核会被拒

在App Store Connect申请测试账号

  1. 在测试的iOS设备上退出普通账号,然后启动游戏,在游戏提交支付时StoreKit会提示你登录,这时用测试账号登录并支付,交易完成,但不会真的扣款。这里要注意:测试账号不能直接在设置里登录,否则会失效。
  2. 沙盒测试时验证receipt用的url和生产环境用的url是不一样的。它们分别是
  • 沙盒环境,“https://sandbox.itunes.apple.com/verifyReceipt”
  • 生产环境,“https://buy.itunes.apple.com/verifyReceipt”
    所以在实际验证receipt的时候,我们一般先用生产url验证票据,如果收到21007状态码,则表明这是个沙盒票据,那么接着就切换到沙盒url验证,从而避免手动在这两种环境之间切换。

在正确配置好Product ID和测试账号后,通常需要等待一段时间,最长24小时,否则可能遇到沙盒测试购买失败的情况。这是因为App Store准备沙盒测试环境需要一段时间。

接入StoreKit

获取Product信息

有了Product ID,我们就可以建立一个Product请求(SKProductsRequest,以一组Product ID初始化,指定一个实现协议 SKProductsRequestDelegate的代理以处理请求结果SKProductsResponse),向App Store获取合法的Product的本地化信息(保存在SKProduct中),填充到制作好的Store界面上,同时App Store还会返回请求里不合法的Product ID列表。不可识别的原因通常是ID拼写错误、标记为不可销售、Connect的信息还未同步到其他App Store服务器等。下面是上述的简单实现样例:

// 你定义的异步验证Product ID和获取Product信息的方法
- (void)validateProductIdentifiers:(NSArray *)productIdentifiers
{
   
    SKProductsRequest *productsRequest = [[SKProductsRequest alloc]
        initWithProductIdentifiers:[NSSet setWithArray:productIdentifiers]];

    // 保存request引用,避免被游戏回收
    self.request = productsRequest;
    productsRequest.delegate = 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值