我在点击购买的时候突然断网了,这个时候并没有返回成功,但是我在连上网络后,并不会在走代理方法,只有当进程杀死后,然后在进入到这个页面,那个成功的代理方法才会走.这个问题如何解决呢??
可以把订单先保存到本地,然后没次请求的时候先去走本地的订单如果有直接去请求没有的话走新下订单,
一、最近公司很多的项目用到了内购,抽空整理下内购的详细内容吧。
1、先从内购的iTunesConnect里配置说起吧,我们先进入苹果的iTunesConnect链接https://itunesconnect.apple.com,然后进入入下界面。
银行信息填写
填写好银行卡信息和公司地址等信息以后,第一步算完成了。
2、进入iTunesConnect选择我的APP模块,创建新的APP,绑定好你在苹果开发者中心创建的apple IDS还有bundle id,那么就创建成功了一个新的APP应用。如下图:
创建APP
3、进入新创建的APP应用,点击如图所示功能按钮:
我的APP“功能”
4、进入功能以后我们就可以创建我们想要的内购产品的ID了,一般都会存在如下几个选择项:
选择类型
5、我们公司的项目由于都是直播类型的课程购买,所以用的是消耗型的项目,选择好然后就进入创建界面里去创建产品了。
需要填写的几项
6、填写好这几项,一个新的内购产品就创建成功了,我们需要记录下每个产品的内购ID,也就是唯一ID,为以后购买产品做准备。
7、我们需要在工程里配置好证书,测试证书是必须的因为我们内购需要连接到苹果的App Store的,需要正式的测试证书才能测试,同时把下图工程中的这一配置打开:
这是很重要的一步
二、讲完上面基本的配置以后,我们进入我们最重要的部分,那就是我们的代码部分。
1、要使用苹果的内购功能,我们需要引入苹果的头件“#import”,引入进来以后,我们就需要引入"SKProductsRequestDelegate,SKPaymentTransactionObserver"这两个代理,我们需要在内购的那个页面viewDidLoad方法里直接调用方法,如下图:
开启内购检测
然后接下来就是几个最重要的代理方法了,如果正常的内购能够走通,那么这几个代理方法就会很流畅的运行过去,并且返回你所购买的商品的信息。让我们一步步来分析:
内购购买(1)
内购购买(2)
内购购买(3)
内购购买(4)
内购购买(5)
内购购买(6)
内购完成
2、进过我这一堆的代码组合,是否已经明白了内购的方式了呢,只要把我列举的这几个方法,统统的导入进你的工程,那么就基本上可以了。
三、常见内购错误,自己做内购总结的几个常见错误。
1、请求不到内购的产品信息。
解决办法:(1)、先看看bundle id,和测试证书之类的东西配置的都对不对,然后看看产品的唯一ID和iTunesConnect里的能不能对应上。如果都没有问题,那么看下面的。
(2)、去看看iTunesConnect里的协议里面的公司的地址信息和银行卡信息是否填写正确,只要没有报错,报红就可以。基本上上面这几点弄好了也就能请求到商品了。
2、手机提示无法连接到itunesStore
解决办法:把手机的Apple ID先注销掉,然后购买的时候重新填写Apple ID。
作者:优雅地小男子
链接:https://www.jianshu.com/p/c252b2ccb078
來源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//==============================================================
第一步.png
第二步.jpg
第三步.jpg
第四步.png
第五步.png
第六步.png
第七步.jpg
第八步.jpg
第九步.jpg
第十步.png
CNAPS CODE 查询地址
https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp
十一步.jpg
十二步.jpg
十三步.png
十四步.png
need-to-insert-img
十五步.jpg
十七步.jpg
十八步.jpg
十九步.png
2016/11/18号更新
十九步(1).png
十九步(2).png
没显示的都是可以不填的,主要是打钩 title 和最后面的Self
二十步.png
=============第二部分创建内购项目============
1.png
2.png
3.png
4.png
5.png
6.png
7.png
===========第三部分贴加内购项目测试账号==========
创建测试账号.png
沙盒测试员.png
账号信息.png
=============第四部分主要实现代码==========
首先导入StoreKit.framework库
.h文件
#importenum{IAP0p20=20,IAP1p100,IAP4p600,IAP9p1000,IAP24p6000,}buyCoinsTag;//代理@interfaceRechargeVC:UIViewController{intbuyType;}- (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@interfaceRechargeVC()@end@implementationRechargeVC- (void)viewDidLoad { [superviewDidLoad]; [[SKPaymentQueuedefaultQueue] addTransactionObserver:self]; [selfbuy:IAP0p20];}-(void)buy:(int)type{ buyType = type;if([SKPaymentQueuecanMakePayments]) { [selfRequestProductData];NSLog(@"允许程序内付费购买");}else{NSLog(@"不允许程序内付费购买");UIAlertView*alerView = [[UIAlertViewalloc] initWithTitle:@"提示"message:@"您的手机没有打开程序内付费购买"delegate:nilcancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView show]; }}-(void)RequestProductData{NSLog(@"---------请求对应的产品信息------------");NSArray*product =nil;switch(buyType) {caseIAP0p20: product=[[NSArrayalloc] initWithObjects:ProductID_IAP0p20,nil];break;caseIAP1p100: product=[[NSArrayalloc] initWithObjects:ProductID_IAP1p100,nil];break;caseIAP4p600: product=[[NSArrayalloc] initWithObjects:ProductID_IAP4p600,nil];break;caseIAP9p1000: product=[[NSArrayalloc] initWithObjects:ProductID_IAP9p1000,nil];break;caseIAP24p6000: product=[[NSArrayalloc] initWithObjects:ProductID_IAP24p6000,nil];break;default:break;}NSSet*nsset = [NSSetsetWithArray:product];SKProductsRequest*request=[[SKProductsRequestalloc] initWithProductIdentifiers: nsset]; request.delegate=self; [request start];}// 请求协议//收到的产品信息- (void)productsRequest:(SKProductsRequest*)request didReceiveResponse:(SKProductsResponse*)response{NSLog(@"-----------收到产品反馈信息--------------");NSArray*myProduct = response.products;NSLog(@"产品Product ID:%@",response.invalidProductIdentifiers);NSLog(@"产品付费数量: %d", (int)[myProduct count]);// populate UIfor(SKProduct*productinmyProduct){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) {caseIAP0p20: payment = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP0p20];//支付25break;caseIAP1p100: payment = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP1p100];//支付108break;caseIAP4p600: payment = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP4p600];//支付618break;caseIAP9p1000: payment = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP9p1000];//支付1048break;caseIAP24p6000: payment = [SKPaymentpaymentWithProductIdentifier:ProductID_IAP24p6000];//支付5898break;default:break;}NSLog(@"---------发送购买请求------------"); [[SKPaymentQueuedefaultQueue] addPayment:payment];}- (void)requestProUpgradeProductData{NSLog(@"------请求升级数据---------");NSSet*productIdentifiers = [NSSetsetWithObject:@"com.productid"];SKProductsRequest* productsRequest = [[SKProductsRequestalloc] initWithProductIdentifiers:productIdentifiers]; productsRequest.delegate =self; [productsRequest start];}//弹出错误信息- (void)request:(SKRequest*)request didFailWithError:(NSError*)error{NSLog(@"-------弹出错误信息----------");UIAlertView*alerView = [[UIAlertViewalloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription] delegate:nilcancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil]; [alerView show];}-(void) requestDidFinish:(SKRequest*)request{NSLog(@"----------反馈信息结束--------------");}-(void) PurchasedTransaction: (SKPaymentTransaction*)transaction{NSLog(@"-----PurchasedTransaction----");NSArray*transactions =[[NSArrayalloc] initWithObjects:transaction,nil]; [selfpaymentQueue:[SKPaymentQueuedefaultQueue] updatedTransactions:transactions];}// 千万不要忘记绑定,代码如下://----监听购买结果//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];- (void)paymentQueue:(SKPaymentQueue*)queue updatedTransactions:(NSArray*)transactions//交易结果{NSLog(@"-----paymentQueue--------");for(SKPaymentTransaction*transactionintransactions) {switch(transaction.transactionState) {caseSKPaymentTransactionStatePurchased:{//交易完成[selfcompleteTransaction:transaction];NSLog(@"-----交易完成 --------");UIAlertView*alerView = [[UIAlertViewalloc] initWithTitle:@""message:@"购买成功"delegate:nilcancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView show]; }break;caseSKPaymentTransactionStateFailed://交易失败{ [selffailedTransaction:transaction];NSLog(@"-----交易失败 --------");UIAlertView*alerView2 = [[UIAlertViewalloc] initWithTitle:@"提示"message:@"购买失败,请重新尝试购买"delegate:nilcancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil]; [alerView2 show]; }break;caseSKPaymentTransactionStateRestored://已经购买过该商品[selfrestoreTransaction:transaction];NSLog(@"-----已经购买过该商品 --------");caseSKPaymentTransactionStatePurchasing://商品添加进列表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) {NSArray*tt = [product componentsSeparatedByString:@"."];NSString*bookid = [tt lastObject];if([bookid length] >0) { [selfrecordTransaction:bookid]; [selfprovideContent:bookid];}}// Remove the transaction from the payment queue.[[SKPaymentQueuedefaultQueue] finishTransaction: transaction];}//记录交易-(void)recordTransaction:(NSString*)product{NSLog(@"-----记录交易--------");}//处理下载内容-(void)provideContent:(NSString*)product{NSLog(@"-----下载--------");}- (void) failedTransaction: (SKPaymentTransaction*)transaction{NSLog(@"失败");if(transaction.error.code !=SKErrorPaymentCancelled) { } [[SKPaymentQueuedefaultQueue] 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(@"%@", [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding]);}- (void)connectionDidFinishLoading:(NSURLConnection*)connection{}- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response{switch([(NSHTTPURLResponse*)response statusCode]) {case200:case206:break;case304:break;case400:break;case404:break;case416:break;case403:break;case401:case500:break;default:break; }}- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error {NSLog(@"test");}-(void)dealloc{ [[SKPaymentQueuedefaultQueue] removeTransactionObserver:self];//解除监听}@end