为你的应用添加In App Purchase--App程序内收费
转自F.A.B.L.E,原文 http://sh3ng.com/2009/10/practice-in-app-purchase/
自从09年10月16日苹果发送给所有开发者的那一封 信,通知了程序内购买将可用于免费应用,我认为这也宣告了LITE版的时代结束。 成千上万的免费版的软件或游戏,将作为限制了功能的完整版免费发售,如果用户觉得有意购买,可以直接解锁完整版的功能或购买附加内容。 本文讲阐述如何为你现有的应用或游戏添加程序内购买(In App Purchase)功能。 阅读前提:假设了你拥有一定的iPhone SDK开发基础,和App Store实践经验。 你的程序需要唯一的Bundle ID, 如果已经发布的程序使用了通配符,那么就不能直接添加该功能。如果拥有了唯一的ID,请在program portal中添加你的app id,允许程序使用内购买(Enable In App Purchase)。 在设计好你的程序内购买的功能以后,首先需要定义元数据。来到iTunes Connect,在Manage Your In App Purchases中为你的程序添加一个程序内购买的商品。
上面第一个部分是添加的内部信息。参考名称,ID,类型,和价格。以及各种本地化信息。
这里简单说一下类型的选择,其他信息,以及In App Purchase支持什么类型的商品请查看Getting Started with In App Purchase。
Non-consumable 默认类型,非消耗品,具有持久性,特点是一次性购买,可用在所有设备。例如解锁游戏的储存关卡功能。
Consumable 消耗品,用完或使用后消失,可多次购买,不能用在所有的设备,例如游戏中的血瓶或技能书。
Subscription 订阅,和消耗品一样,除了可以在设备之间共享。
创建购买流程
大致可以分为十个步骤:
自从09年10月16日苹果发送给所有开发者的那一封 信,通知了程序内购买将可用于免费应用,我认为这也宣告了LITE版的时代结束。 成千上万的免费版的软件或游戏,将作为限制了功能的完整版免费发售,如果用户觉得有意购买,可以直接解锁完整版的功能或购买附加内容。 本文讲阐述如何为你现有的应用或游戏添加程序内购买(In App Purchase)功能。 阅读前提:假设了你拥有一定的iPhone SDK开发基础,和App Store实践经验。 你的程序需要唯一的Bundle ID, 如果已经发布的程序使用了通配符,那么就不能直接添加该功能。如果拥有了唯一的ID,请在program portal中添加你的app id,允许程序使用内购买(Enable In App Purchase)。 在设计好你的程序内购买的功能以后,首先需要定义元数据。来到iTunes Connect,在Manage Your In App Purchases中为你的程序添加一个程序内购买的商品。
- 验证App Store存取权限 这样做是因为,家长控制或一些公司的配置文件阻止了此功能,使用支付队列的查询功能canMakePayments来确定用户是否有权限购买,返回值 YES代表可以购买/NO代表没有权限购买。
- 载入目录 载入储存在本地或者远程的商品目录。
- 获得商品本地化信息
程序向App Store发起查询请求获得目录中商品的本地化信息。:
myPossibleProds = [NSSet setWithObjects: @”myProd1”, @”myProd2”, @”myProd3, nil]; myProdRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: myPossibleProds]; myProdRequest.delegate = myProductsRequestDelegate; [myProdRequest start];
程序接收来自App Store的回应:-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response response包含可能的信息 response.products //产品信息 response.invalidProductIdentifiers //错误的产品标示符
错误的产品可能由下面的原因导致:- 商品未在 iTunes Connect中录入。
- 商品没有选择“Cleared for Sale”。
- 商品还没有传播到所有服务器。
- 创建商品信息
前面的步骤获得了产品信息的数组用以呈现:
myAvailableProductsArray = response.products; for (SKProduct* aProduct in myAvailableProductsArray) { diplayTitle = aProduct.localizedTitle; displayDesc = aProduct.localizedDescription; displayPrice = aProduct.price; }
- 呈现商品信息 在UI中显示前面获得的信息
- 请求支付
myPayment = [SKPayment paymentForProductIdentifier: selectedProdID userInfo: nil];
或myPayment = [SKPayment paymentForProduct: selectedProduct userInfo: nil];
然后提交到队列defaultPaymentQueue = [SKPaymentQueue defaultQueue]; [defaultPaymentQueue addTransactionObserver: myObserver];
[defaultPaymentQueue addPayment: myPayment];[defaultPaymentQueue addPayment: myRequest];- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
- 验证支付的事务
for(SKPaymentTransaction *aTransaction in transactions) { switch (aTransaction.transactionState ) {
// 商品进入购买流程 case SKPaymentTransactionStatePurchasing: ... break; // 成功购买商品 case SKPaymentTransactionStatePurchased: ... break; // 已经购买过该商品 case SKPaymentTransactionStateRestored: ... break; // 用户取消交易 case: SKPaymentTransactionStateFailed ... break;
App Store的交易回执 aTransaction.transactionReceipt- Used to validate e-commerce transaction
- Cryptographically signed chunk of data
- Contains information about the purchase
- Can validate using Web-based API
- 解锁内置物品火提供远程存取地址
需要注意的地方
- 用户可能随时退出程序。
- Store Kit 的交易队列是持久化的。
- 交易是持久化的。
- 验证存取。
- 移除交易。
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
- 储存购买 需要将非消耗的购买记录在服务器上,以供用户更换设备或删除程序以后重新安装时再次解锁功能。
- 提供物品恢复
前面的代码中,已经购买过该商品的处理就是直接解锁。
defaultPaymentQueue = [SKPaymentQueue defaultQueue]; [defaultPaymentQueue restoreCompletedTransactions];
- 收入和应用程序同样的规则
- 你获得总收入的70%。
- 支付日程,使用税,报表等全部都一样。
- 报表
- 一样的报表格式。
- 贩卖的标示符栏显示物品的产品ID。
- 所有者标示符栏显示程序的ID。
转载于:https://www.cnblogs.com/liuxingzi/archive/2012/11/13/3404249.html