iOS的开发内购全套图文教程
来源:互联网 发布:立冬为什么吃饺子 知乎 编辑:程序博客网 时间:2024/06/05 10:37
“一开始是工作中最重要的部分。”柏拉图
==========第一部分协议=======
CNAPS代码查询地址https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp
=============第二部分创建内购项目============
===========第三部分贴加内购项目测试账号==========
=============第四部分主要实现代码==========
首先导入StoreKit.framework
库
.H文件
#define kSandboxVerifyURL @ " https :// sandbox .itunes.apple.com / verifyReceipt " // 开发阶段沙盒验证URL #define kAppStoreVerifyURL @ " https :// buy .itunes.apple.com / verifyReceipt " // 实际购买验证URL #import < StoreKit / StoreKit .h >枚举{ IAP0p20 = 20,IAP1p100,IAP4p600,IAP9p1000,IAP24p6000,} buyCoinsTag ;// 代理@interface RechargeVC : UIViewController < SKPaymentTransactionObserver , SKProductsRequestDelegate >{ INT buyType ; }- (无效) requestProUpgradeProductData ;- (无效)RequestProductData ;- (无效)购买:( INT )型;- (无效)paymentQueue :( SKPaymentQueue *)队列 updatedTransactions :( NSArray的 *)的交易;- (无效) PurchasedTransaction : (SKPaymentTransaction *)的交易;- (无效) completeTransaction : (SKPaymentTransaction *)的交易;- (无效) failedTransaction : (SKPaymentTransaction *)的交易;- (无效) paymentQueueRestoreCompletedTransactionsFinished : (SKPaymentTransaction *)的交易;- ( void ) paymentQueue :( SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError :( NSError *) error ;- (无效) restoreTransaction : (SKPaymentTransaction *)的交易;- (无效)provideContent :( 的NSString *)的产品;- (无效)recordTransaction :( 的NSString *)的产品;@结束
.M文件
#进口 “ 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 ()@ 结束@ 实施 RechargeVC- (无效)viewDidLoad中 { [ 超级 viewDidLoad中]; [ SKPaymentQueue defaultQueue ] addTransactionObserver :自我]; [ 自 团购: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 秀] } }- ( 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(@“ 产品付费数量: %Ð ”(INT)myProduct的计数]); //填充UI 对于(SKProduct *在myProduct的产品){ 的NSLog(@“ 产品 信息”); 的NSLog(@“ SKProduct 描述信息%@ ”,[产品说明]); 的NSLog(@“ 产品标题 %@ ”,product.localizedTitle); 的NSLog(@“ 产品描述信息: %@ ”,product.localizedDescription); 的NSLog(@“ 价格: %@ ”,product.price); 的NSLog(@“ 产品 ID : %@ ”,product.productIdentifier);} SKPayment *支付=零; 开关(buyType){ 案例IAP0p20: 支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20]; //支付25 打破; 案例IAP1p100: 支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100]; //支付108 打破; 案例IAP4p600: 支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600]; //支付618 打破; 案例IAP9p1000: 支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000]; //支付1048 打破; 案例IAP24p6000: 支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000]; //支付5898 打破; 默认: 打破;} 的NSLog(@“ --------- 发送购买请求------------ ”); [SKPaymentQueue defaultQueue] addPayment:付款];}- (无效)requestProUpgradeProductData{ 的NSLog(@“ ------ 请求升级数据--------- ”); *的NSSet = productIdentifiers [的NSSet setWithObject:“@ COM 。的productid ”]; SKProductsRequest * productsRequest = [[SKProductsRequest页头] initWithProductIdentifiers:productIdentifiers]; productsRequest.delegate =自我; [productsRequest开始]}//弹出错误信息- (无效)要求:(SKRequest *)要求didFailWithError:(NSError *)错误{ 的NSLog(@“ ------- 弹出错误信息---------- ”); UIAlertView中* alerView = [[UIAlertView中页头] initWithTitle:NSLocalizedString(@“ 警报”,NULL)消息:[错误localizedDescription] 代表:无cancelButtonTitle:NSLocalizedString(@“ 关闭”,无)otherButtonTitles:无]; [alerView秀]}- (无效)requestDidFinish:(SKRequest *)的请求{ 的NSLog(@“ ---------- 反馈信息结束-------------- ”);}- (无效)PurchasedTransaction:(SKPaymentTransaction *){交易 的NSLog(@“ ----- PurchasedTransaction ---- ”); NSArray的*交易= [[NSArray的页头] initWithObjects:交易,无] [个体经营paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:交易]}// <SKPaymentTransactionObserver>千万不要忘记绑定,代码如下:// ----监听购买结果// [SKPaymentQueue defaultQueue] addTransactionObserver:个体经营];- (无效)paymentQueue:(SKPaymentQueue *)队列updatedTransactions:(NSArray的*)交易//交易结果{ 的NSLog(@“ ----- paymentQueue -------- ”); 对(在交易SKPaymentTransaction *交易) { 开关(transaction.transactionState) { 案例SKPaymentTransactionStatePurchased:{//交易完成 [个体经营completeTransaction:交易] 的NSLog(@“ ----- 交易完成 -------- ”); //购买成功后进行验证 [个体经营verifyPurchaseWithPaymentTransaction] }打破; 案例SKPaymentTransactionStateFailed://交易失败 {[自failedTransaction:交易] 的NSLog(@“ ----- 交易失败 -------- ”); UIAlertView中* alerView2 = [[UIAlertView中页头] initWithTitle:@“ 提示” 消息:@“ 购买失败,请重新尝试购买” 代表:无cancelButtonTitle:NSLocalizedString(@“ 关闭”,无)otherButtonTitles:无]; [alerView2秀] }打破; 案例SKPaymentTransactionStateRestored://已经购买过该商品 [个体经营restoreTransaction:交易] 的NSLog(@“ ----- 已经购买过该商品 -------- ”); 案例SKPaymentTransactionStatePurchasing://商品添加进列表 的NSLog(@“ ----- 商品添加进列表 -------- ”); 打破; 默认: 打破; } }}/ ***验证购买,避免越狱软件模拟苹果请求达到非法购买问题** /- (无效){verifyPurchaseWithPaymentTransaction //从沙盒中获取交易凭证并且拼接成请求体数据 NSURL * receiptUrl = [[一个NSBundle mainBundle] appStoreReceiptURL]; NSData的* receiptData = [NSData的dataWithContentsOfURL:receiptUrl]; * NSString的receiptString = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; //转化为BASE64字符串 * NSString的bodyString = [的NSString stringWithFormat:@“ {\ ” 接收数据\“: \"%@\"}" , receiptString ]; //拼接请求数据 NSData *bodyData = [bodyString dataUsingEncoding : NSUTF8StringEncoding ]; //创建请求到苹果官方进行购买验证 NSURL *url=[NSURL URLWithString : kSandboxVerifyURL ]; NSMutableURLRequest *requestM=[NSMutableURLRequest requestWithURL : url ]; requestM.HTTPBody=bodyData; requestM.HTTPMethod=@"POST"; //创建连接并发送同步请求 NSError *error=nil; NSData *responseData=[NSURLConnection sendSynchronousRequest : requestM returningResponse : nil error : & error ]; if (error) { NSLog(@"验证购买过程中发生错误,错误信息:%@",error.localizedDescription); return; } NSDictionary * dic =[ NSJSONSerialization JSONObjectWithData :responseData options :NSJSONReadingAllowFragments error :nil ]; NSLog (@ " %@ " , dic ); if ([ dic [@ " status " ] intValue ]== 0 ) { NSLog(@"购买成功!"); NSDictionary *dicReceipt= dic[@"receipt"]; NSDictionary *dicInApp=[dicReceipt[@"in_app"] firstObject]; NSString *productIdentifier= dicInApp[@"product_id"];//读取产品标识 //如果是消耗品则记录购买数量,非消耗品则记录是否购买过 NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults]; if ([productIdentifier isEqualToString : kProductID3 ]) { int purchasedCount = [ defaults integerForKey : productIdentifier ]; //已购买数量 [[NSUserDefaults standardUserDefaults] setInteger :( purchasedCount + 1 ) forKey : productIdentifier ]; } else { [defaults setBool : YES forKey : productIdentifier ]; } [ self .tableView reloadData ]; // 在此处对购买记录进行存储,可以存储到开发商的服务器端 } else { NSLog(@"购买失败,未通过验证!"); } }- (无效) completeTransaction : (SKPaymentTransaction *)交易{ NSLog(@"-----completeTransaction--------"); // Your application should implement these two methods. NSString *product = transaction.payment.productIdentifier; if ([product length] > 0) { NSArray *tt = [product componentsSeparatedByString : @ "." ]; NSString *bookid = [tt lastObject]; if ([bookid length] > 0) { [self recordTransaction : bookid ]; [self provideContent : bookid ]; } } // 删除 该 交易 从 该 支付 队列。 [ SKPaymentQueue defaultQueue ] finishTransaction : 交易]}// 记录交易- (无效)recordTransaction :( 的NSString *)产品{ 的NSLog(@“-----记录交易--------”); }// 处理下载内容- (无效)provideContent :( 的NSString *)产品{ 的NSLog(@“-----下载--------”); }- ( void ) failedTransaction : ( SKPaymentTransaction *) transaction { NSLog(@"失败"); if (transaction.error.code != SKErrorPaymentCancelled) { } [ SKPaymentQueue defaultQueue ] finishTransaction : 交易]} - (无效) paymentQueueRestoreCompletedTransactionsFinished : (SKPaymentTransaction *)交易{}- (无效) restoreTransaction : (SKPaymentTransaction *)交易{ 的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 ; } }- (无效)连接:( NSURLConnection的 *)连接 didFailWithError :( NSError *)错误 { 的NSLog(@“测试”); }- (无效)的dealloc { [SKPaymentQueue defaultQueue] removeTransactionObserver :自我]; //解除监听}@结束
0 0
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS开发内购全套图文教程
- iOS的开发内购全套图文教程
- iOS - 最新苹果内购图文教程
- iOS-iOS内购流程(手把手图文教程)
- IOS开发-项目的完整重命名方法,图文教程。
- iOS开发-项目的完整重命名方法,图文教程。
- iOS开发-项目的完整重命名方法,图文教程
- iOS开发-项目的完整重命名方法,图文教程。
- Vuforia 全套图文教程和视频教程
- iOS开发微信支付图文教程
- 支付宝支付开发IOS图文教程
- 现今最详细的angular开发环境配置全套教程
- iOS开发内购教程In App Purchase 需要了解的
- hello
- asp.net 操作ftp上传下载 实战
- cenos 下的一些常用命令及技巧收集篇
- 1.WSDL 简介
- IOS视图层次结构
- iOS的开发内购全套图文教程
- mac osx 系统好软件
- 【ZOJ 1500】 Pre-Post-erous!
- MySQL时间戳转日期
- Android Studio 的小白Debug日志
- hello,CSDN
- oracle使用数据导出与导入
- 在 ubuntu中 安装eclipse
- Cadence中Quickview中没有预览