文档章节

IOS应用内购买App开发完整流程

Charly张
 Charly张
发布于 2016/01/19 17:51
字数 1567
阅读 3671
收藏 10

看了一些网上教程,基本上是老版本的了。我针对自己遇到的一些问题,结合官方文档把IAP(In-App Purchase)过程梳理了一下。 P.S. 官方文档才是王道!

编码之前

应用内购买要和App Store发生交互,这里在正式编写代码前需要做几个工作。

  • 完善账户信息

收费App、含应用内购买的App等有付费功能的需要完善这部分信息。 1. 进入iTunes Connect

iTunes Connect是苹果提供的一个平台,主要提供App发布和管理App的,最重要的功能是创建管理项目信息,项目付费产品(道具)管理、付费的测试账号、提交App等等。 2. 进入协议、税务和银行业务

	这一部分具体可以参照这篇[iOS App提交指南(二)-协议、税务和银行业务](http://www.jianshu.com/p/c7cf65911bc1)

协议税务银行业务

  • 创建App

    1. 进入iTunes Connect

    2. 进入我的App 进入新建App

    3. 新建App

      这里说一下,套装ID就是Bundle ID,保证和Xcode项目中的Bundle ID一致。其实不晓得填的地方点击那个小问号就有提示了。(我不知道为嘛要截这么多图,或许会让文章显得亲切点😄) 新建App

    对了,新建App时要保证应用内购买的功能时勾选上的。

  • 创建商品

    建好支持应用内购买的App后,就可以该App可购买的商品了。

    1. 创建App内购买项目

      依次点击*{创建的App名}* -> 功能 -> App内购买项目 -> + 创建App内购买项目

    2. 选择项目类型 项目类型

一般对项目来说大多数都是选择“消耗型项目”这个种类,比如游戏中购买虚拟货币等。具体区别请看这里

3. 项目摘要
    ![项目摘要](https://static.oschina.net/uploads/img/201601/19174703_ZQq8.png "在这里输入图片标题")        

	- 参考名称:商品名称,可以根据商品等实际意义填写,不会显示在App Store
	- 产品ID:要求唯一性,可以用App的Bundle ID加后缀表示
	- 价格等级:苹果的销售商品不能随意定价,按等级选择合适的即可。点击*查看价格表*可以看到各等级价格,以及商品卖出后你的实际收益。
    ![价格标准](https://static.oschina.net/uploads/img/201601/19174754_vbSk.png "在这里输入图片标题")

	其中**CNY**为人民币

4. 项目详情
    ![项目详情](https://static.oschina.net/uploads/img/201601/19174734_eBjd.png "在这里输入图片标题")    

	- 语言:至少添加一种语言的项目描述
	- 审核备注:我填了测试账户信息
	- 屏幕快照:按要求上传,我传的是支付页面的屏幕截图
	
5. 等待审核
    ![等待审核](https://static.oschina.net/uploads/img/201601/19174909_jxtW.png "在这里输入图片标题")

**!这个状态下已经能编码对相应商品就行购买测试了,*审核通过*的状态得等到App提交后才行**
  • 申请测试账号

用户与职能

1. 进入**用户与职能**
2. 点击**沙箱技术测试员**
3. 点击**+**添加新账号

***注意:***
- 账号记不住密码就删除,再用不同的邮箱重新创建
- 账号创建后不能被修改
- 沙盒测试账户被删除后,该Apple ID也不能再用作*沙盒测试用户*和*iTunes Connect用户*
- 账号邮箱可以是随意编造
- ***该账号不能用来在正式的App Store上登录,只用于测试环境下***
  • 测试账号的使用

    1. 清除测试设备的账号信息
    2. 在设备的"设置"里退出App Store账号(这能避免测试过程中真实账号被使用)
    3. 在Xcode中将App编到测试设备
    4. 在测试时,App会要求登录,这时候选择测试账号登录,完成交易

代码部分

  • 购买流程

购买阶段

总的来说,交互分为三个阶段:

  1. 获取商品信息: app向App Store请求商品信息,并展示;
  2. 购买请求: 用户选择商品,由app向App Store请求购买;
  3. 交付商品: App Store处理支付请求,app交付商品。

!在Xcode中要加入StoreKit.framework

  • 获取商品信息

    1. 从App Bundle或者自己的服务器上获取商品的ID
    	// Load the product identifiers fron ProductIds.plist
    	NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"ProductIds" withExtension:@"plist"];
    	NSArray *productIds = [NSArray arrayWithContentsOfURL:plistURL];
    
      这里的product id就是在**iTunes Connect**中创建的应用内购买项目的ID。
    
    1. 将商品ID集合发给App Store(利用SKProductsRequest)
    	// Create a product request object and initialize it with our product identifiers
    	SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIds]];
    	request.delegate = self;
    
    	// Send the request to the App Store
    	[request start];
    
      这里由StoreKit发起异步请求。
    
    1. 将App Store返回的商品信息展示(返回的商品用SKProduct表示)
    	-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    	{
    ...
    	}
    
  • 购买请求

    1. 向SKPaymentQueue添加一个购买请求
    	 SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
    	[[SKPaymentQueue defaultQueue] addPayment:payment];
    

    SKPaymentQueue会自动向App Sotre 提交购买请求。

    1. 给SKPaymentQueue添加监听器,该监听器实现了SKPaymentTransactionObserver协议
    	// Attach an observer to the payment queue
    	[[SKPaymentQueue defaultQueue] addTransactionObserver:[StoreObserver sharedInstance]];
    

    demo中是在App启动时就添加了监听器。 主要实现的方法是下面这个更新用的:

// Called when there are trasactions in the payment queue -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { for(SKPaymentTransaction * transaction in transactions) { switch (transaction.transactionState ) { ... // 购买成功 case SKPaymentTransactionStatePurchased: ... break; // 恢复交易 case SKPaymentTransactionStateRestored: ... break; // 购买失败 case SKPaymentTransactionStateFailed: ... break; default: break; } } } ```

Restore这种交易状态是恢复。如果有些人在iPhone上用一个账号购买了一个产品,那么在iPad上又下载了这个应用,就不需要重新购买了。通过Restore在App Store中检测你这个账号的购买记录,如果有购买记录存在,那就不用再次购买了,直接恢复,就会出现restoreTransaction。关于 商品恢复,请点击会打断app工作流,不应该每次启动时执行,应该让用户自己触发

  • 交付商品

    1. 将购买成功的商品纪录保存,以便下次启动时用
    2. 调用SKPaymentQueue的finishTransaction方法
  • demo

    demo项目修改

    • 点击下载demo
    • 将工程target中的Bundle Identifier改成前面创建的App ID
    • 在工程中的ProductIds.plist中添加前面在iTunes Connect中创建的商品ID
    • 编译运行

参考

© 著作权归作者所有

Charly张
粉丝 8
博文 22
码字总数 15101
作品 0
海淀
程序员
私信 提问
苹果 App Store 申请和管理相关知识

app store为开发者提供四种类型的申请: 个人ios开发者计划$99/年 公司ios开发者计划$99/年 企业ios开发者计划$299/年 高校ios开发者计划免费 在这里主要介绍一下公司ios开发者计划,只有利用...

鉴客
2012/01/09
50.4K
4
Iphone开发这一路走来(新手必经)

今天把自己ios开发总结的整个流程和找到的资料贴出来,方便自己也方便大家。 流程:注册,开发,真机测试,发布,上线。 iphone iOS4从注册到app上线开发流程 http://blog.csdn.net/linzhij...

abcMx
2013/12/02
0
0
iOS项目开发

主要需求: 通过远程网络对汽车进行OBD(启动、熄火、门锁检测、车辆状态设置与检测、胎压等相关汽车状态的设置与获取展示) 工作内容: 1. 熟悉车载CAN、OBD相关行业知识 2.负责智能穿戴产品I...

黄淑宾
2017/02/22
3
0
iOS 学习资料整理

视频教程(英文) Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Applic...

拉偶有所依
2015/01/19
2.2K
4
安卓APP跟iOSAPP的对比

随着现在移动互联网的发展,手机APP应用在我们的生活中起到了很重要的位置,而手机APP的系统无非就是安卓跟iOS等主流操作系统,两者之间有什么区别的呢?   很多人想开发APP但是不知道我要...

dthuliancom
2016/10/27
472
4

没有更多内容

加载失败,请刷新页面

加载更多

聊聊Elasticsearch的CircuitBreakerService

序 本文主要研究一下Elasticsearch的CircuitBreakerService CircuitBreakerService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/indices/breaker/CircuitBreakerService.ja......

go4it
7分钟前
0
0
Spring系列教程六:AOP详细讲解

AOP 概述 什么是 AOP AOP:全称是 Aspect Oriented Programming 即:面向切面编程。 AOP技术是对OOP技术的一种延伸,AOP是面向纵向,OOP是面向横向。简单的说它就是把我们程序重复的代码抽取...

我叫小糖主
21分钟前
7
0
Qt编写数据可视化大屏界面电子看板9-曲线效果

一、前言 为了编写数据可视化大屏界面电子看板系统,为了能够兼容Qt4和嵌入式linux系统,尤其是那种主频很低的,但是老板又需要在这种硬件上(比如树莓派、香橙派、全志H3、imx6)展示这么华...

飞扬青云
42分钟前
3
0
责任链模式

//这篇博客的博主真的不错,解析的都很清晰明了, https://blog.csdn.net/jason0539/article/details/45091639

南桥北木
今天
3
0
Flutter -------- dio网络请求

dio是Flutter中文网开源的一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时等... 1.添加依赖# dependencies: dio: 2.1.x #...

切切歆语
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部