iOS- 给App添加内购& 验证购买iOS7新特性
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了iOS- 给App添加内购& 验证购买iOS7新特性,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5491字,纯文字阅读大概需要8分钟。
内容图文
![iOS- 给App添加内购& 验证购买iOS7新特性](/upload/InfoBanner/zyjiaocheng/1072/a966f314d3bd4fa59f3d8e605355bfee.jpg)
1.内购——应用内购买
我所说的内购——也可以说是应用内购买
2.内购的类别有哪几种呢?
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)viewDidLoad 2{ 3 [super viewDidLoad]; 45 [self requestProducts]; 67// 设置购买队列的监听器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]; 910// 去收银台排队,准备购买(异步网络)11 [[SKPaymentQueue defaultQueue] addPayment:payment]; 12 }
1 - (IBAction)purchaseProducts 2{ 3 [self buyProduct:_productDict[kIAPBullet]]; 4} 56 - (IBAction)purchaseBomb:(id)sender 7{ 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]; } elseif (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]; 910// 发送网络POST请求,对购买凭据进行验证11 NSURL *url = [NSURL URLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL]; 12// 国内访问苹果服务器比较慢,timeoutInterval需要长一点13 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f]; 1415 request.HTTPMethod = @"POST"; 1617// 在网络中传输数据,大多情况下是传输的字符串而不是二进制数据 18// 传输的是BASE64编码的字符串19/** 20 BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性 21 BASE64是可以编码和解码的 22*/23 NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; 2425 NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr]; 26 NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding]; 2728 request.HTTPBody = payloadData; 2930// 提交验证请求,并获得官方的验证JSON结果31 NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 3233// 官方验证结果为空34if (result == nil) { 35 NSLog(@"验证失败"); 36 } 3738 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil]; 3940 NSLog(@"%@", dict); 4142if (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
原文:http://www.cnblogs.com/qingche/p/3561424.html
内容总结
以上是互联网集市为您收集整理的iOS- 给App添加内购& 验证购买iOS7新特性全部内容,希望文章能够帮你解决iOS- 给App添加内购& 验证购买iOS7新特性所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。