iOS开发内购详细版本说明

我在点击购买的时候突然断网了,这个时候并没有返回成功,但是我在连上网络后,并不会在走代理方法,只有当进程杀死后,然后在进入到这个页面,那个成功的代理方法才会走.这个问题如何解决呢??

  可以把订单先保存到本地,然后没次请求的时候先去走本地的订单如果有直接去请求没有的话走新下订单,

一、最近公司很多的项目用到了内购,抽空整理下内购的详细内容吧。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • 做了很多电商的项目了,都在用各大第三方支付,作为一名iOS开发,苹果已经在强制推行内购了,所以,你不得不了解一下啦...
    Xcode_6阅读 1,135评论 0 0
  • 一.向appStore提交资料 第一步 第二步 第三步 操作完第三步然后记得保存 第四步 第五步 先点击Conta...
    90后的思维阅读 410评论 1 0
  • ● 复习单词150个 ✔ ● 论文综述 ✔ ● 考研课程 ✔ 扎实的三天!尤其是今天晚上的论文综述,花了三...
    MickeyMinnie阅读 374评论 0 0
  • 早上听许树泽的《树我直言》聊得投资理财,聊得大家普遍认为投资很难,树泽提出其实投资没什么难的,只要注意关注长...
    古董HR阅读 1,478评论 0 0
  • 2016年6月9日 天气是晴朗的,乡下的蚊子有点多,移动信号还不怎么好。柿子给茉莉发了一条微信 手机滴滴的响起来,...
    陌陌丽阅读 986评论 0 0