内购:
--应用程序本身的增值产品,游戏装备,应用程序中增值功能同样可以内购
--三(苹果)七(开发商)开
--内购的五种产品类型
1.非消耗品(Nonconsumable):一旦购买,终身拥有
指的是在游戏中一次性购买并且拥有永久访问权的物品或服务.非消耗品可以被用户再次下载,并且能够在用户的所有上共享
2.消耗品(Consumable):买了就用,用了就没
消耗品购买不可再次下载,根据其特点,消耗品不能在用户的设备之间跨设备使用,除非自定义服务在用户的账号之间共享这些消息
*********************************以下三种类别在iBooks中使用***********************************
ISBN:每本书的一个ID
1.免费订阅(Free subscriptions)
2.自动续费订阅(Auto-renewing subscriptions)
3.非自动续费订阅(Nonrenewing subscriptions)
1.导入内购框架 遵循协议
#import <StoreKit/StoreKit.h>
<SKProductsRequestDelegate,SKPaymentTransactionObserver>
2.具体实现代码
#import "ViewController.h"
#import <StoreKit/StoreKit.h>
@interface ViewController ()<SKProductsRequestDelegate,SKPaymentTransactionObserver>
@property(nonatomic,strong)NSArray*products;
@end
@implementation ViewController
#pragma mark 创建内购对象
- (void)viewDidLoad {
[super viewDidLoad];
//1.� 加载plist文件(模拟想要销售的商品)
NSString *path = [[NSBundle mainBundle]pathForResource:@"Withint.plist" ofType:nil];
NSArray *productsArray = [NSArray arrayWithContentsOfFile:path];
//2. 取出所有想要销售的商品productID
NSArray *productIDArray = [productsArray valueForKey:@"productID"];
//3. 将所有的product放在NSSet里面
NSSet *productIDSet = [NSSet setWithArray:productIDArray];
//4. 创建请求对象
SKProductsRequest *request = [[SKProductsRequest alloc]initWithProductIdentifiers:productIDSet];
//4.1 设置代理
request.delegate = self;
//5. 开始请求可销售的商品
[request start];
}
/**
代理方法
当请求到可销售的商品的时候,会调用此方法
*/
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response NS_AVAILABLE_IOS(3_0){
//NSLog(@"--%ld",response.products.count);
// for(SKProduct *product in response.products){
// NSLog(@"%@",product.localizedTitle);//名称
// NSLog(@"%@",product.localizedDescription);//描述
// NSLog(@"%@",product.price);//价格
// NSLog(@"%@",product.productIdentifier);//id
// }
//1. 保留所有的可销售的产品
self.products = response.products;
//2. 刷新数据
[self.tableView reloadData];
}
#pragma mark tableView的数据源和代理方法
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.products.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *ID = @"productID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
//1.取出模型数据
SKProduct *prouduct = self.products[indexPath.row];
//2.展示在cell上面
cell.textLabel.text = prouduct.localizedTitle;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",prouduct.price];
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// 取出模型数据
SKProduct *product = self.products[indexPath.row];
//购买
[self buyProduct:product];
}
#pragma mark 用户购买的方法
-(void)buyProduct:(SKProduct *)product{
//11. 创建票据
SKPayment *payment = [SKPayment paymentWithProduct:product];
//33. 将票据加入交易队列
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
#pragma mark 添加监听者
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//22. 添加SKPaymentQueue的监听者
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
#pragma mark 移除监听者
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
//44.移除监听者
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
/**
当交易队列当中 有交易状态发生改变的时候会执行该方法
*/
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
/**
SKPaymentTransactionStatePurchasing,//正在购买
SKPaymentTransactionStatePurchased, //已经购买(向服务器发送请求 给用户请求 停止该交易)
SKPaymentTransactionStateFailed,//购买失败
SKPaymentTransactionStateRestored,//恢复购买成功(向服务器发送请求 给用户请求 停止该交易):换个手机登录此app
SKPaymentTransactionStateDeferred//用户未决定最终状态(已经有票据)
*/
//transactions是交易队列里面所有的交易
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchasing:
NSLog(@"用户正在购买");
break;
case SKPaymentTransactionStatePurchased:
NSLog(@"用户购买成功");
//1. 停止所有交易
[queue finishTransaction:transaction];
//2 .请求给用户商品
break;
case SKPaymentTransactionStateFailed:
NSLog(@"用户正购买失败");
break;
case SKPaymentTransactionStateRestored:
NSLog(@"用户恢复购买成功");
//1. 停止所有交易
[queue finishTransaction:transaction];
//2 .请求给用户商品
break;
case SKPaymentTransactionStateDeferred:
NSLog(@"用户未决定最终状态");
break;
default:
break;
}
}
}
#pragma mark 恢复购买
-(IBAction)recoverBuy{
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];//恢复全部的购买
}
@end