1.添加框架,storeKit.framework

  需要真机调试

/*

内购五步: 1.请求可销售商品的列表

2.展示课销售的商品

3.点击购买

4.开具小票

5.创建交易对象并添加到交易队列

6.创建监听对象,监听交易队列中交易对象的交易状态

7.程序结束移除监听对象

*/

#import "ViewController.h"

#import <StoreKit/StoreKit.h>

@interface ViewController ()<SKProductsRequestDelegate,SKPaymentTransactionObserver>

//记录产品列表

@property(nonatomic,strong)NSArray*allProducts;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//1 请求可销售商品的列表

//准备需要销售的商品列表

NSString *path=[[NSBundle mainBundle]pathForResource:@"products.json" ofType:nil];

NSData *data=[NSData dataWithContentsOfFile:path];

NSArray *arrayList=[NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

//产品列表

NSArray *arrayIdList=[arrayList valueForKeyPath:@"productId"];

NSSet *set=[NSSet setWithArray:arrayIdList];

//创建一个请求对象

SKProductsRequest*request=[[SKProductsRequest alloc]initWithProductIdentifiers:set];

//设置代理

request.delegate=self;

//启动请求

[request start];

//创建监听对象 来监听交易队列中交易对象的交易状态

[[SKPaymentQueue defaultQueue]addTransactionObserver:self];

}

//代理方法,返回请求对象的数据列表

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response

{

for (SKProduct*product in response.products) {

//对象中包含商品对象的所有信息

}

self.allProducts=response.products;

//刷新表格

[self.tableView reloadData];

}

//2.展示可销售商品

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

return   self.allProducts.count;

}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

static NSString *ID=@"cell";

UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];

if (cell==nil) {

cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];

}

SKProduct *product=self.allProducts[indexPath.row];

cell.textLabel.text=product.localizedTitle;

cell.detailTextLabel.text=[NSString stringWithFormat:@"%@圆",product.price];

return cell;

}

//3点击购买

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

//4开票

SKProduct *pro=self.allProducts[indexPath.row];

SKPayment *payment=[SKPayment paymentWithProduct:pro];

//5,创建交易对象,添加到交易队列

//NSString *str=[NSBundle mainBundle]pathForResource:@"blue.bundle/blue/" ofType:nil;

[[SKPaymentQueue defaultQueue]addPayment:payment];

}

//监听交易队列 中 的交易状态 改变的时候就会调用

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions

{

//非消耗品  才能被恢复购买

/*

SKPaymentTransactionStatePurchasing,    交易正在被添加到交易队列

SKPaymentTransactionStatePurchased,     //交易已经在队列,用户已经付钱,客户端需要完成交易

SKPaymentTransactionStateFailed,        //还没添加到队列中就取消或者失败了

SKPaymentTransactionStateRestored,      // 交易被恢复购买,客户端需要完成交易

SKPaymentTransactionStateDeferred NS_ENUM_AVAILABLE_IOS(8_0),   交易在队列中,交易状态不确定依赖别的参数参与

*/

//7.如果交易成功提供 交易的产品

for(SKPaymentTransaction *t in transactions)

{

if (t.transactionState==SKPaymentTransactionStatePurchased) {

//提供服务

//结束交易

[[SKPaymentQueue defaultQueue]finishTransaction:t];

}else if(t.transactionState==SKPaymentTransactionStateRestored)

{

//恢复购买成功

//结束交易

[[SKPaymentQueue defaultQueue]finishTransaction:t];

}

}

}

-(void)dealloc

{

[[SKPaymentQueue defaultQueue]removeTransactionObserver:self];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

}

@end

ios内购的更多相关文章

  1. iOS - 内购总结

        如果有人以后要在做内购这一块.希望可以好好的阅读这篇文章,虽然不是字字珠玑.但是也是本人亲人趟过了无数的坑,希望可以对大家有所帮助!  下面是在研究工程中遇到的问题(iOS 内购的流程如下 1 ...

  2. IOS内购支付server验证模式

    IOS 内购支付两种模式: 内置模式 server模式 内置模式的流程: app从app store 获取产品信息 用户选择须要购买的产品 app发送支付请求到app store app store ...

  3. IOS内购支付服务器验证模式

    IOS 内购支付两种模式: 内置模式 服务器模式 内置模式的流程: app从app store 获取产品信息 用户选择需要购买的产品 app发送支付请求到app store app store 处理支 ...

  4. Unity苹果(iOS)内购接入(Unity内置IAP)

    https://www.jianshu.com/p/4045ebf81a1c Unity苹果(iOS)内购接入(Unity内置IAP) Kakarottog                       ...

  5. iOS 内购遇到的坑

    一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 原因: 当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购 ...

  6. 苹果IOS内购二次验证返回state为21002的坑

    项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...

  7. iOS 内购相关

    iOS 内购相关 下面总结一下过往订阅和内购的项目的代码方面的实现细节和注意事项,特别是掉单方面的处理. 后台的协议.商品ID.银行卡.内购类型.沙盒账号测试人员都由运营或者产品在苹果后台中申请处理. ...

  8. iOS 内购讲解

    一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银 ...

  9. IOS内购--后台PHP认证

    参考网址:https://blog.csdn.net/que_csdn/article/details/80861408 http://www.php.cn/php-weizijiaocheng-39 ...

  10. IOS - 内购

    内购的五种产品类别 •非消耗品(Nonconsumable)买了就有,头衔,功能 –指的是在游戏中一次性购买并拥有永久访问权的物品或服务.非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用 ...

随机推荐

  1. POJ 2121

    http://poj.org/problem?id=2121 一道字符串的转换的题目. 题意:就是把那个英文数字翻译成中文. 思路:首先打表,然后把每一个单独的单词分离出来,在组合相加相乘. #inc ...

  2. struts2 校验demo

    综合练习: <validators> <field name="username"> <field-validator type="requ ...

  3. .net在当前日期的基础上加一天

    比如今天是:2015-11-10 18:57:01,在这个基础上加一天,那么就是2015-11-11 18:57:01,代码如下: DateTime now_dt = DateTime.Now; ). ...

  4. MVC3.0删除数据的时候给提示信息

    Index.cshtml代码: @model IEnumerable<FirstMvc.Models.Book> <script type="text/javascript ...

  5. delphi 控件大全(确实很全)

    delphi 控件查询:http://www.torry.net/ http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar)控件库,仿Office97,如TDoC ...

  6. C#封装C++DLL

    1.新建一个C#-Windows-类库(用于创建C#类库(.dll)的项目)类型的工程 2.对于普通C++函数 XXXX_API void cppFun(int i); 在cs代码中添加 [DllIm ...

  7. 使用连发互联空间+SQLyog 设置我们的数据库链接

    在我使用SQLyog(小海豚)管理我的数据库的时候,主机空间为连发互联的(自己做着玩,这个便宜),遇到一些坑,自己写一下记录一下,省的下次忘记了又浪费时间. 首先你要有连发互联的空间,可以淘宝购买,连 ...

  8. 合唱队形2(洛谷U5874)

    题目背景 上次老师挑出来的(N-K)位同学很不高兴,于是他们准备自己组建合唱队形.他们请了kkk来帮忙. 题目描述 他们安排了一个动作--手拉着手唱一首歌(就是他们围成一个圈).如果有两个相邻的同学的 ...

  9. Git命令之上传与同步

    操作步骤,可参考:http://blog.csdn.net/chenyufeng1991/article/details/47299461. 1.在本地仓库中,即项目目录下创建文件,如: 2.查看当前 ...

  10. Android 录音

    想要实现wav格式的编码时我们也就不能再使用MediaRecorder,而只能使用AudioRecord进行处理