iOS开发内购全套图文教程
2016-05-20 11:31
525 查看
2015年最全的内购图文教程,首先是填各种资料,最后是代码,废话不多说,直接上图
======================第一部分协议===============
![](http://upload-images.jianshu.io/upload_images/671504-c9f6d71001d0419c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第一步.png
![](http://upload-images.jianshu.io/upload_images/671504-83a8c87f6f4f1433.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第二步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-bc46f8f7468be3ef.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第三步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-d1b4956c1f0e8779.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第四步.png
![](http://upload-images.jianshu.io/upload_images/671504-7b5c75d22e3b5787.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第五步.png
![](http://upload-images.jianshu.io/upload_images/671504-46c5a9d16763b092.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第六步.png
![](http://upload-images.jianshu.io/upload_images/671504-457cd5497f99371e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第七步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-f56576c77985ef30.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第八步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-00494fae74f2544c.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第九步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-057f976f3e3da37b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第十步.png
CNAPS CODE 查询地址
https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp
![](http://upload-images.jianshu.io/upload_images/671504-45953f24404344d3.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十一步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-4d81d772484db328.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十二步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-16594172d1580bca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十三步.png
![](http://upload-images.jianshu.io/upload_images/671504-e46f153964b261b4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十四步.png
![](http://upload-images.jianshu.io/upload_images/671504-aef70a2389b54aca.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十五步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-6d05595da297d7a3.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十七步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-caa7f10992e20b46.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十八步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-4836398594ebfbab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十九步.png
![](http://upload-images.jianshu.io/upload_images/671504-0fce14bd05090dc3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
二十步.png
=============第二部分创建内购项目============
![](http://upload-images.jianshu.io/upload_images/671504-5065ee93c4fe6dac.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1.png
![](http://upload-images.jianshu.io/upload_images/671504-c67c70780dbd3c32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.png
![](http://upload-images.jianshu.io/upload_images/671504-8cc2cf3347c5d2e7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3.png
![](http://upload-images.jianshu.io/upload_images/671504-541dd14e93c039c6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4.png
![](http://upload-images.jianshu.io/upload_images/671504-e36ca61677daa2bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5.png
![](http://upload-images.jianshu.io/upload_images/671504-934a6f7e0c8a0b6e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
6.png
![](http://upload-images.jianshu.io/upload_images/671504-2525b376a1e090d6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
7.png
===========第三部分贴加内购项目测试账号==========
![](http://upload-images.jianshu.io/upload_images/671504-9917ae3d196d0429.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
创建测试账号.png
![](http://upload-images.jianshu.io/upload_images/671504-9c980ddc05d14877.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
沙盒测试员.png
![](http://upload-images.jianshu.io/upload_images/671504-b20a1cbe16b19d8a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
账号信息.png
=============第四部分主要实现代码==========
首先导入
======================第一部分协议===============
![](http://upload-images.jianshu.io/upload_images/671504-c9f6d71001d0419c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第一步.png
![](http://upload-images.jianshu.io/upload_images/671504-83a8c87f6f4f1433.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第二步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-bc46f8f7468be3ef.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第三步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-d1b4956c1f0e8779.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第四步.png
![](http://upload-images.jianshu.io/upload_images/671504-7b5c75d22e3b5787.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第五步.png
![](http://upload-images.jianshu.io/upload_images/671504-46c5a9d16763b092.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第六步.png
![](http://upload-images.jianshu.io/upload_images/671504-457cd5497f99371e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第七步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-f56576c77985ef30.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第八步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-00494fae74f2544c.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第九步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-057f976f3e3da37b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
第十步.png
CNAPS CODE 查询地址
https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp
![](http://upload-images.jianshu.io/upload_images/671504-45953f24404344d3.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十一步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-4d81d772484db328.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十二步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-16594172d1580bca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十三步.png
![](http://upload-images.jianshu.io/upload_images/671504-e46f153964b261b4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十四步.png
![](http://upload-images.jianshu.io/upload_images/671504-aef70a2389b54aca.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十五步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-6d05595da297d7a3.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十七步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-caa7f10992e20b46.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十八步.jpg
![](http://upload-images.jianshu.io/upload_images/671504-4836398594ebfbab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
十九步.png
![](http://upload-images.jianshu.io/upload_images/671504-0fce14bd05090dc3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
二十步.png
=============第二部分创建内购项目============
![](http://upload-images.jianshu.io/upload_images/671504-5065ee93c4fe6dac.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
1.png
![](http://upload-images.jianshu.io/upload_images/671504-c67c70780dbd3c32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.png
![](http://upload-images.jianshu.io/upload_images/671504-8cc2cf3347c5d2e7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3.png
![](http://upload-images.jianshu.io/upload_images/671504-541dd14e93c039c6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
4.png
![](http://upload-images.jianshu.io/upload_images/671504-e36ca61677daa2bd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5.png
![](http://upload-images.jianshu.io/upload_images/671504-934a6f7e0c8a0b6e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
6.png
![](http://upload-images.jianshu.io/upload_images/671504-2525b376a1e090d6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
7.png
===========第三部分贴加内购项目测试账号==========
![](http://upload-images.jianshu.io/upload_images/671504-9917ae3d196d0429.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
创建测试账号.png
![](http://upload-images.jianshu.io/upload_images/671504-9c980ddc05d14877.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
沙盒测试员.png
![](http://upload-images.jianshu.io/upload_images/671504-b20a1cbe16b19d8a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
账号信息.png
=============第四部分主要实现代码==========
首先导入
StoreKit.framework库
.h文件
#import <StoreKit/Stor 4000 eKit.h> enum{ IAP0p20=20, IAP1p100, IAP4p600, IAP9p1000, IAP24p6000, }buyCoinsTag; //代理 @interface RechargeVC : UIViewController <SKPaymentTransactionObserver,SKProductsRequestDelegate > { int buyType; } - (void) requestProUpgradeProductData; -(void)RequestProductData; -(void)buy:(int)type; - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions; -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction; - (void) completeTransaction: (SKPaymentTransaction *)transaction; - (void) failedTransaction: (SKPaymentTransaction *)transaction; -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction; -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error; - (void) restoreTransaction: (SKPaymentTransaction *)transaction; -(void)provideContent:(NSString *)product; -(void)recordTransaction:(NSString *)product; @end
.m文件
#import "RechargeVC.h" //在内购项目中创的商品单号 #define ProductID_IAP0p20 @"Nada.JPYF01"//20 #define ProductID_IAP1p100 @"Nada.JPYF02" //100 #define ProductID_IAP4p600 @"Nada.JPYF03" //600 #define ProductID_IAP9p1000 @"Nada.JPYF04" //1000 #define ProductID_IAP24p6000 @"Nada.JPYF05" //6000 @interface RechargeVC () @end @implementation RechargeVC - (void)viewDidLoad { [super viewDidLoad]; [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; [self buy:IAP0p20]; } -(void)buy:(int)type { buyType = type; if ([SKPaymentQueue canMakePayments]) { [self RequestProductData]; NSLog(@"允许程序内付费购买"); } else { NSLog(@"不允许程序内付费购买"); UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"您的手机没有打开程序内付费购买" delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView show]; } } -(void)RequestProductData { NSLog(@"---------请求对应的产品信息------------"); NSArray *product = nil; switch (buyType) { case IAP0p20: product=[[NSArray alloc] initWithObjects:ProductID_IAP0p20,nil]; break; case IAP1p100: product=[[NSArray alloc] initWithObjects:ProductID_IAP1p100,nil]; break; case IAP4p600: product=[[NSArray alloc] initWithObjects:ProductID_IAP4p600,nil]; break; case IAP9p1000: product=[[NSArray alloc] initWithObjects:ProductID_IAP9p1000,nil]; break; case IAP24p6000: product=[[NSArray alloc] initWithObjects:ProductID_IAP24p6000,nil]; break; default: break; } NSSet *nsset = [NSSet setWithArray:product]; SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset]; request.delegate=self; [request start]; } //<SKProductsRequestDelegate> 请求协议 //收到的产品信息 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ NSLog(@"-----------收到产品反馈信息--------------"); NSArray *myProduct = response.products; NSLog(@"产品Product ID:%@",response.invalidProductIdentifiers); NSLog(@"产品付费数量: %d", (int)[myProduct count]); // populate UI for(SKProduct *product in myProduct){ NSLog(@"product info"); NSLog(@"SKProduct 描述信息%@", [product description]); NSLog(@"产品标题 %@" , product.localizedTitle); NSLog(@"产品描述信息: %@" , product.localizedDescription); NSLog(@"价格: %@" , product.price); NSLog(@"Product id: %@" , product.productIdentifier); } SKPayment *payment = nil; switch (buyType) { case IAP0p20: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20]; //支付25 break; case IAP1p100: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100]; //支付108 break; case IAP4p600: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600]; //支付618 break; case IAP9p1000: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000]; //支付1048 break; case IAP24p6000: payment = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000]; //支付5898 break; default: break; } NSLog(@"---------发送购买请求------------"); [[SKPaymentQueue defaultQueue] addPayment:payment]; } - (void)requestProUpgradeProductData { NSLog(@"------请求升级数据---------"); NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"]; SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers]; productsRequest.delegate = self; [productsRequest start]; } //弹出错误信息 - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{ NSLog(@"-------弹出错误信息----------"); UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription] delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil]; [alerView show]; } -(void) requestDidFinish:(SKRequest *)request { NSLog(@"----------反馈信息结束--------------"); } -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{ NSLog(@"-----PurchasedTransaction----"); NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil]; [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions]; } //<SKPaymentTransactionObserver> 千万不要忘记绑定,代码如下: //----监听购买结果 //[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易结果 { NSLog(@"-----paymentQueue--------"); for (SKPaymentTransaction *transaction in transactions) { switch (transaction.transactionState) { case SKPaymentTransactionStatePurchased:{//交易完成 [self completeTransaction:transaction]; NSLog(@"-----交易完成 --------"); UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"" message:@"购买成功" delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView show]; } break; case SKPaymentTransactionStateFailed://交易失败 { [self failedTransaction:transaction]; NSLog(@"-----交易失败 --------"); UIAlertView *alerView2 = [[UIAlertView alloc] initWithTitle:@"提示" message:@"购买失败,请重新尝试购买" delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView2 show]; }break; case SKPaymentTransactionStateRestored://已经购买过该商品 [self restoreTransaction:transaction]; NSLog(@"-----已经购买过该商品 --------"); case SKPaymentTransactionStatePurchasing: //商品添加进列表 NSLog(@"-----商品添加进列表 --------"); break; default: break; } } } - (void) completeTransaction: (SKPaymentTransaction *)transaction { NSLog(@"-----completeTransaction--------"); // Your application should implement these two methods. NSString *product = transaction.payment.productIdentifier; if ([product length] > 0) { ca7e NSArray *tt = [product componentsSeparatedByString:@"."]; NSString *bookid = [tt lastObject]; if ([bookid length] > 0) { [self recordTransaction:bookid]; [self provideContent:bookid]; } } // Remove the transaction from the payment queue. [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; } //记录交易 -(void)recordTransaction:(NSString *)product{ NSLog(@"-----记录交易--------"); } //处理下载内容 -(void)provideContent:(NSString *)product{ NSLog(@"-----下载--------"); } - (void) failedTransaction: (SKPaymentTransaction *)transaction{ NSLog(@"失败"); if (transaction.error.code != SKErrorPaymentCancelled) { } [[SKPaymentQueue defaultQueue] finishTransaction: transaction]; } -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{ } - (void) restoreTransaction: (SKPaymentTransaction *)transaction { NSLog(@" 交易恢复处理"); } -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error{ NSLog(@"-------paymentQueue----"); } #pragma mark connection delegate - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); } - (void)connectionDidFinishLoading:(NSURLConnection *)connection{ } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ switch([(NSHTTPURLResponse *)response statusCode]) { case 200: case 206: break; case 304: break; case 400: break; case 404: break; case 416: break; case 403: break; case 401: case 500: break; default: break; } } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"test"); } -(void)dealloc { [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除监听 } @end
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- iOS推送的那些事