打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
iOS

2.内购的类别有哪几种呢?

在游戏中我们经常用到的主要由分两种:

非消耗品 (Nonconsumable)买了就有,头衔,功能

指的是在游戏中一次性购买并拥有永久访问权的物品或服务。非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用

消耗品 (Consumable),买了就用,用了就没

专为支持可消耗的物品或服务设计的,消耗品购买不可被再次下载,根据其特点,消耗品不能在用户的设备之间跨设备使用,除非自定义服务在用户的账号之间共享这些信息

3.添加内购功能

3.1 在 iTunes Connect 中给自己的应用添加消耗品定义

3.2在iTunes Connect 中给自己的应用添加定义的商品

3.3要使用内购,需要导入StoreKit框架

 定义好的商品

#define kIAPBomb @ "airplay.10bombs"

#define kIAPBullet @"airplay.laserBullet"

1. 实例化请求时,必须指定有效的identifiers集合,之所以如此处理,主要是为了确保提交的内购商品真的通过了苹果的审批,处于可用状态!

2. 要想获取到准确的可用产品集合,需要通过代理方法实现

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

3. 越狱用户无法测试内购,但是可以购买

1 @interface ITViewController () <SKProductsRequestDelegate, SKPaymentTransactionObserver>2 {3     // 产品字典4     NSMutableDictionary *_productDict;5 }
1 - (void)viewDidLoad2 {3     [super viewDidLoad];4     5     [self requestProducts];6     7     // 设置购买队列的监听器8     [[SKPaymentQueue defaultQueue] addTransactionObserver:self];9 }

3.4.询问苹果的服务器能够销售哪些商品

#pragma mark 询问苹果的服务器能够销售哪些商品- (void)requestProducts{    // 能够销售的商品    NSSet *set = [[NSSet alloc] initWithObjects:kIAPBomb, kIAPBullet, nil];        // "异步"询问苹果能否销售    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:set];        request.delegate = self;        // 启动请求    [request start];}

3.5.获取询问结果,成功采取操作把商品加入可售商品字典里

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{    if (_productDict == nil) {        _productDict = [NSMutableDictionary dictionaryWithCapacity:response.products.count];    }        for (SKProduct *product in response.products) {        // 激活了对应的销售操作按钮,相当于商店的商品上架允许销售        NSLog(@"%@", product.productIdentifier);                if ([product.productIdentifier isEqualToString:kIAPBullet]) {            _bulletButton.enabled = YES;        }                if ([product.productIdentifier isEqualToString:kIAPBomb]) {            _bombButton.enabled = YES;        }                // 填充商品字典        [_productDict setObject:product forKey:product.productIdentifier];    }}

3.6.用户决定购买商品

 1 #pragma mark - 用户决定购买商品 2 - (void)buyProduct:(SKProduct *)product 3 { 4     // 要购买产品(店员给用户开了个小票) 5     SKPayment *payment = [SKPayment paymentWithProduct:product]; 6      7 //    // 设置购买队列的监听器 8 //    [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 9     10     // 去收银台排队,准备购买(异步网络)11     [[SKPaymentQueue defaultQueue] addPayment:payment];12 }
1 - (IBAction)purchaseProducts2 {3     [self buyProduct:_productDict[kIAPBullet]];4 }5 6 - (IBAction)purchaseBomb:(id)sender7 {8     [self buyProduct:_productDict[kIAPBomb]];9 }

3.7.判断购买状态是否成功

#pragma mark - SKPaymentTransaction Observer#pragma mark 购买队列状态变化- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{    // 调试    for (SKPaymentTransaction *transaction in transactions) {        NSLog(@"队列状态变化 %@", transaction);        // 如果小票状态是购买完成        if (SKPaymentTransactionStatePurchased == transaction.transactionState) {            NSLog(@"购买完成 %@", transaction.payment.productIdentifier);                        // 更新界面或者数据,把用户购买得商品交给用户            // ...            // 验证购买凭据            [self verifyPruchase];                        // 将交易从交易队列中删除            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];        } else if (SKPaymentTransactionStateRestored == transaction.transactionState) {            NSLog(@"恢复成功 %@", transaction.payment.productIdentifier);            // 更新界面或者数据,把用户购买得商品交给用户            // ...            // 将交易从交易队列中删除            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];        }    }}

3.8.给用户提供恢复功能(因为在不同设备上永久性商品可能会出现需要恢复购买的情况)

#pragma mark - 恢复商品- (void)restorePurchase{    // 恢复已经完成的所有交易.(仅限永久有效商品)    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];}

3.9.验证购买(防止第三方插件漏洞)iOS7新特性

提示:虽然苹果在iOS7提升了购买凭据的安全性,但是处于金钱考虑,购买完成后,一定要做凭据的验证工作。

 1 #pragma mark 验证购买凭据 2 - (void)verifyPruchase 3 { 4     // 验证凭据,获取到苹果返回的交易凭据 5     // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址 6     NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; 7     // 从沙盒中获取到购买凭据 8     NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL]; 9     10     // 发送网络POST请求,对购买凭据进行验证11     NSURL *url = [NSURL URLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL];12     // 国内访问苹果服务器比较慢,timeoutInterval需要长一点13     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];14     15     request.HTTPMethod = @"POST";16     17     // 在网络中传输数据,大多情况下是传输的字符串而不是二进制数据18     // 传输的是BASE64编码的字符串19     /**20      BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性21      BASE64是可以编码和解码的22      */23     NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];24     25     NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];26     NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];27 28     request.HTTPBody = payloadData;29     30     // 提交验证请求,并获得官方的验证JSON结果31     NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];32 33     // 官方验证结果为空34     if (result == nil) {35         NSLog(@"验证失败");36     }37     38     NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil];39     40     NSLog(@"%@", dict);41     42     if (dict != nil) {43         // 比对字典中以下信息基本上可以保证数据安全44         // bundle_id&application_version&product_id&transaction_id45         NSLog(@"验证成功");46     }47 }

3.9.说说整个购买流程结构

1.苹果APP(商家) ——— 2.告诉苹果Store服务器要卖的商品 ——— 3.苹果审核完(告诉你是否可以卖)

4.用户(买商品) ———  5.苹果APP(商家) ———  6.开发票给(用户) ————

7.用户(拿着发票去苹果Store服务器付款) —— 8.付款成功(用户在APP里获得服务商品)

(注意:如果要模拟测试内购,需要用真机才可以测试)

清澈Saup

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
iOS内购(IAP)自动续订订阅类型总结
iOS应用内付费(IAP)开发步骤列表
iOS内置付费开发笔记
iOS友盟第三方登录分享
iOS开发内购全套图文教程
IOS开发中XML解析和Json解析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服