美文网首页
内购从0到1

内购从0到1

作者: MR_詹 | 来源:发表于2020-07-01 17:55 被阅读0次

转载:https://blog.csdn.net/zhonggaorong/article/details/49280537

========================================第一部份===================================

首先进入苹果的ItunesConnection(https://itunesconnect.apple.com)点击左上角的加号新建一个App应用,点击后该网站会弹出一个信息编辑框,大家只要将上面的信息填充完毕点击save即可在苹果的app平台上拥有一个属于自己的App。

image

在套装ID的上,需要提前为该App申请一个AppID以及BundleID,只要是申请成功了就会在选择列表中显示出来。如果有人有疑问如何申请,请看我之前那一篇推送的博客,里面有详细的步骤。附上链接点击打开链接

这里顺便多说一句这个ItunesConnect是用来干嘛的,它是苹果公司给个人或企业提供管理自己App的一个平台。在这个平台上开发者可以新建,删除和管理自己的App应用,开发者可以根据需求对App应用进行上架与下架,编辑App信息,生成测试app所需的信息,例如账号,邀请码等,还有就是我们今天要讲的内付费功能。当然啦,他的功能可不止我讲的这些,我大致说一下这个平台的作用,如果你经常跟它打交道的话就会慢慢熟悉了。

============================================第二部分=====================================

接下来,我就来为大家演示一下如何添加付费道具,首先打开iTunesConnect,显示如下页面

image

选择红圈所圈起来的选项,然后将里面的相关信息补充完毕,如果缺少这一步,内购功能是不会成功的。

假如你已经完成了上述相关银行账户的设置,就点击你的App,选择上面标题栏中的"App 内购买项目"

image

随后点击左上角的 "create new"选项,如下图所示,进入到下一个界面

image

这个界面是让你选择消费道具的种类,现在改版的网站是有简体中文翻译的,所以不像以前打开一看都不知道选哪一个,甚至都不知道每个代表的什么意思(比如我第一次遇到的时候,在领导面前真是囧)。它的种类分为如下几种:

image

一般对项目来说大多数都是选择“消耗型项目”这个种类,比如游戏中购买金币,宝石balabala~之类的,选中之后就会到这个界面中来:

image

在上图所示的编辑框中输入,商品名称,产品ID以及价格等级,在这边说明一下:

1.商品名称根据你的消费道具的实际意义来说明,比如“100颗宝石”,“100金币”等。

2.产品ID是比较重要的,由项目自定义,只要唯一即可,像我一般都是用App的bundleID加一个后缀来表示,这样既跟项目关联又具有唯一性。

3.价格等级的话“查看价格表”中有对应的说明,可以对照着表中每个国家的货币价格与等级来选择。

我们继续,在这个网页的接下来部分如图所示: image

选择添加语言选项,弹出一个编辑页面:

image

点击save保存,则会在界面上显示成如下:

image

最后一步就是点击“选取文件”提交一张苹果它指定像素(640*920)的商品图片,当他上传完毕后点击“save”按钮,我们这第二部分就大工告成了。提交的商品最后会在内购的页面上显示为如图:

image

这个图是我在已经发布的app上面截取的,添加了3个商品,已经是通过的的状态了(显示绿色),当您刚提交的时候,因为通过苹果的审查需要一段时间所以会显示黄色的等待状态,所以不必担心是不是商品编辑错了。如图:

image

=====================================第三部分======================================

这部分,我主要给大家演示一下,如何申请测试账号,利用苹果的沙盒测试环境来模拟AppStore的购买流程。

在ItunesConnect中选择“用户和职能”选项~

image

随后在左上角的选项中选择沙盒测试者,点击左上角的加号图标增加一位测试者,如图:

image

编辑好相应的内容,点击保存,就创建了一个测试账号,是不是很简单啊!当然这个账号如果你忘记了密码可以重新生成一个,无关紧要。

顺带多句嘴,千万不要在正式的appstore上面用沙盒测试的账号来登录,不然后果很严重,千万要牢记在心,此账号只用于测试环境下~

=====================================第四部分===========================================

接下来就是代码部分啦~

1.首先在项目工程中加入“storekit.framework”,加入头文件#import <StoreKit/StoreKit.h>

2.在.h文件中加入“SKPaymentTransactionObserver,SKProductsRequestDelegate”监听机制

下面贴上内购的核心代码,就几个函数,我在这边就不在做更多详细的解释了,各位看官可以运行跑一下就一目了然了。

.h文件

[objc] view plaincopy

<embed id="ZeroClipboardMovie_1" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;">

<embed id="ZeroClipboardMovie_3" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;">

  1. //

  2. // PaymentViewController.h

  3. // IAPPayTest

  4. //

  5. // Created by silicon on 14-10-28.

  6. // Copyright (c) 2014年 silicon. All rights reserved.

  7. //

  8. import <UIKit/UIKit.h>

  9. import <StoreKit/StoreKit.h>

  10. @interface PaymentViewController : UIViewController<SKPaymentTransactionObserver,SKProductsRequestDelegate>

  11. @property (strong, nonatomic) IBOutlet UITextField *productID;

  12. @property (strong, nonatomic) IBOutlet UIButton *purchase;

    • (IBAction)purchaseFunc:(id)sender;
  13. @end

.m文件

[objc] view plaincopy[图片上传失败...(image-ec5026-1593597380020)] [图片上传失败...(image-aa6c-1593597380020)]

<embed id="ZeroClipboardMovie_2" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;">

<embed id="ZeroClipboardMovie_4" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="16" height="16" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&width=16&height=16" wmode="transparent" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;">

  1. //

  2. // PaymentViewController.m

  3. // IAPPayTest

  4. //

  5. // Created by silicon on 14-10-28.

  6. // Copyright (c) 2014年 silicon. All rights reserved.

  7. //

  8. import "PaymentViewController.h"

  9. @interface PaymentViewController ()

  10. @end

  11. @implementation PaymentViewController

    • (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
  12. {

  13. self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

  14. if (self) {

  15. // Custom initialization

  16. }

  17. return self;

  18. }

    • (void)viewDidLoad
  19. {

  20. [super viewDidLoad];

  21. // Do any additional setup after loading the view from its nib.

  22. [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

  23. self.productID.text = @"com.games.ztyxs.product_point.1";

  24. }

    • (void)didReceiveMemoryWarning
  25. {

  26. [super didReceiveMemoryWarning];

  27. // Dispose of any resources that can be recreated.

  28. }

    • (IBAction)purchaseFunc:(id)sender {
  29. NSString *product = self.productID.text;

  30. if([SKPaymentQueue canMakePayments]){

  31. [self requestProductData:product];

  32. }else{

  33. NSLog(@"不允许程序内付费");

  34. }

  35. }

  36. //请求商品

    • (void)requestProductData:(NSString *)type{
  37. NSLog(@"-------------请求对应的产品信息----------------");

  38. NSArray *product = [[NSArray alloc] initWithObjects:type, nil nil];

  39. NSSet *nsset = [NSSet setWithArray:product];

  40. SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];

  41. request.delegate = self;

  42. [request start];

  43. }

  44. //收到产品返回信息

    • (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
  45. NSLog(@"--------------收到产品反馈消息---------------------");

  46. NSArray *product = response.products;

  47. if([product count] == 0){

  48. NSLog(@"--------------没有商品------------------");

  49. return;

  50. }

  51. NSLog(@"productID:%@", response.invalidProductIdentifiers);

  52. NSLog(@"产品付费数量:%d",[product count]);

  53. SKProduct *p = nil;

  54. for (SKProduct *pro in product) {

  55. NSLog(@"%@", [pro description]);

  56. NSLog(@"%@", [pro localizedTitle]);

  57. NSLog(@"%@", [pro localizedDescription]);

  58. NSLog(@"%@", [pro price]);

  59. NSLog(@"%@", [pro productIdentifier]);

  60. if([pro.productIdentifier isEqualToString:self.productID.text]){

  61. p = pro;

  62. }

  63. }

  64. SKPayment *payment = [SKPayment paymentWithProduct:p];

  65. NSLog(@"发送购买请求");

  66. [[SKPaymentQueue defaultQueue] addPayment:payment];

  67. }

  68. //请求失败

    • (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
  69. NSLog(@"------------------错误-----------------:%@", error);

  70. }

    • (void)requestDidFinish:(SKRequest *)request{
  71. NSLog(@"------------反馈信息结束-----------------");

  72. }

  73. //监听购买结果

    • (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
  74. for(SKPaymentTransaction *tran in transaction){

  75. switch (tran.transactionState) {

  76. case SKPaymentTransactionStatePurchased:

  77. NSLog(@"交易完成");

  78. break;

  79. case SKPaymentTransactionStatePurchasing:

  80. NSLog(@"商品添加进列表");

  81. break;

  82. case SKPaymentTransactionStateRestored:

  83. NSLog(@"已经购买过商品");

  84. break;

  85. case SKPaymentTransactionStateFailed:

  86. NSLog(@"交易失败");

  87. break;

  88. default:

  89. break;

  90. }

  91. }

  92. }

  93. //交易结束

    • (void)completeTransaction:(SKPaymentTransaction *)transaction{
  94. NSLog(@"交易结束");

  95. [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

  96. }

    • (void)dealloc{
  97. [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

  98. [super dealloc];

  99. }

  100. @end

代码就这么多,到这边我们的IOS内购教程就接近尾声了,在测试的时候还有几点因素要注意一下:

1.沙盒环境测试appStore内购流程的时候,请使用没越狱的设备。

2.请务必使用真机来测试,一切以真机为准。

3.项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。

讲了这么多,附上几张测试截屏给大家展示一下:

请求商品时的打印日志

image

交易成功后:

image

手机截屏:

要求输入AppStore帐密,使用测试生成的即可

image

确定购买:

image

交易完成:

image

好了,所有的内购流程基本上讲完了,原谅我在图片上的涂抹,因为关系到产品的敏感词汇所以希望大家能够不介意。赶这篇博客的时间比较匆忙,如果有童鞋还有什么疑问或者我写的那个地方不对欢迎私信我或者评论,我会在第一时间回复。谢谢~

相关文章

  • 内购从0到1

    转载:https://blog.csdn.net/zhonggaorong/article/details/492...

  • 从0到0,从0到1。

    昨天和一客户交流,听到这么一句话,我现在的阶段勉强算0到0的阶段,到那个1的阶段还没有看到,或者说并不知道那个1在...

  • 从 0 到 1 认识从 0 到 1

    看了太多从 0 到 1 的标题了,总感觉那是在乱用流行的标题,记得这个标题是从阿里开始的,从 0 到 1 的书,活...

  • 从1到0,0到1。

    把经历过的一切事情都归零是件很难可以做到的事情,并不会像计算器那么简单。 有时候想,如果人的大脑能像机器那样多好,...

  • iOS开发支付篇——内购(IAP)详解

    1内购所需要的资料整理总结 思维导图 重点总结: 1.获取内购列表(从App内读取或从自己服务器读取) 2.App...

  • 从0到1

    【阅读感悟】 书名《书都不会读,你还想成功》 听了猫叔“更好的表达课”,发现自己太差劲了,做什么事都是三分热度,不...

  • 从0到1

    1第一层境界:企业只是制造满足市场需求的产品,只要有原型,工业流水线可以让产品大量地复制生产出来。但产品有生命周期...

  • 从0到1

    1创 造性垄断就是新产品既让大众受益,又可以给创造者带来长期利润。竞争意味着大家都没有利润,产品没有实质差异,而且...

  • 《从0到1》

    经营一个优秀企业的七大问题:工程问题、时机问题、垄断问题、团队问题、销售问题、持久问题、秘密问题。——《从0到1:...

  • 从0到1

    开一间工作室是我的梦想。 为此,我上了创业课,读了大量书,取得了正面管教讲师资格,成为了一名鼓励咨询师和个人成长建...

网友评论

      本文标题:内购从0到1

      本文链接:https://www.haomeiwen.com/subject/tryhqktx.html