代码改变世界

InAppPurchase总结

2012-09-17 17:50  v2m  阅读(2399)  评论(3编辑  收藏  举报

一.简介

1.功能
IAP可用于支付 内容,功能,服务,订阅。不能用来支付 实物,实体服务,虚拟货币,带有色情/仇恨/暴力/赌博等等性质的内容或服务

 

2.商品按类型可分为:
Consumable  每次都收费(消耗品)


Non-consumable  付费一次(非消耗品)


Auto-renewable subscriptions  自动同步订阅(服务有效期间内自动同步其他机器上的订阅)
Free subscriptions  免费订阅 仅用于 Newsstand-enabled apps.


Non-renewing subscriptions  非自动同步订阅,由开发者决定其他机器是否更新

 

3.交易模式
Built-in Product Model 內建product模式,这种方式写死了可以购买哪些物品,提供什么服务
Server Product Model 服务器提供product模式,这种方式就是比较灵活的通过自己的服务器控制提供哪些商品,购买后提供哪些东西

 

二.程序流程


1.程序添加
1)添加一个不带通配符的APP ID,在itunesconnect中添加程序
2)设置iap,添加商品(包括id,名称,详细描述,截图等)
3)添加测试帐号


2.程序内代码编写
1)检查用户是否关闭了程序内付费[SKPaymentQueue canMakePayments]
2)根据给定的标识集合取得商品列表
3)根据用户选择的商品显示支付页面


附:相关类

SKProduct    商品
// 本地化描述
@property(nonatomic, readonly) NSString *localizedDescription
// 本地化标题
@property(nonatomic, readonly) NSString *localizedTitle
// 价格
@property(nonatomic, readonly) NSDecimalNumber *price
// 地域
@property(nonatomic, readonly) NSLocale *priceLocale
// 标识符
@property(nonatomic, readonly) NSString *productIdentifier

 

SKProductsRequest 请求商品列表
@property(nonatomic, assign) id<SKProductsRequestDelegate> delegate
- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers

SKProductsRequestDelegate 请求商品列表委托
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

SKProductsResponse    商品列表返回
// 无效产品id列表
@property(nonatomic, readonly) NSArray *invalidProductIdentifiers
// 产品列表
@property(nonatomic, readonly) NSArray *products

 

SKPayment    付款
// 产品标识
@property(nonatomic, copy, readonly) NSString *productIdentifier
// 数量
@property(nonatomic, readonly) NSInteger quantity
@property(nonatomic, copy, readonly) NSData *requestData
// 生成一个payment
+ (id)paymentWithProduct:(SKProduct *)product

 

SKPaymentQueue 付款队列
@property(nonatomic, readonly) NSArray *transactions
// 检测是否可以内支付
+ (BOOL)canMakePayments
+ (SKPaymentQueue *)defaultQueue

// payment 必须有一个产品id并且quantity>0,否则异常,添加后就会依次显示支付窗口
- (void)addPayment:(SKPayment *)payment
// 添加一个委托
- (void)addTransactionObserver:(id < SKPaymentTransactionObserver >)observer
// 结束交易
- (void)finishTransaction:(SKPaymentTransaction *)transaction
- (void)removeTransactionObserver:(id < SKPaymentTransactionObserver >)observer
// 查看有哪些已经restored的交易
- (void)restoreCompletedTransactions

 

SKPaymentTransaction    交易流程
@property(nonatomic, readonly) NSError *error
// 如果是restored的流程,他有个原始流程
@property(nonatomic, readonly) SKPaymentTransaction *originalTransaction
@property(nonatomic, readonly) SKPayment *payment
// 交易日期
@property(nonatomic, readonly) NSDate *transactionDate
// 标识
@property(nonatomic, readonly) NSString *transactionIdentifier
// 回执
@property(nonatomic, readonly) NSData *transactionReceipt
// 状态:成功,失败,进行中,restored
@property(nonatomic, readonly) SKPaymentTransactionState transactionState

参考:http://iamgarlic.blogspot.com/2011/04/ios-in-app-purchase-1.html

http://iamgarlic.blogspot.com/2011/04/ios-in-app-purchase-2.html