ios内购
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内购的更多相关文章
- iOS - 内购总结
如果有人以后要在做内购这一块.希望可以好好的阅读这篇文章,虽然不是字字珠玑.但是也是本人亲人趟过了无数的坑,希望可以对大家有所帮助! 下面是在研究工程中遇到的问题(iOS 内购的流程如下 1 ...
- IOS内购支付server验证模式
IOS 内购支付两种模式: 内置模式 server模式 内置模式的流程: app从app store 获取产品信息 用户选择须要购买的产品 app发送支付请求到app store app store ...
- IOS内购支付服务器验证模式
IOS 内购支付两种模式: 内置模式 服务器模式 内置模式的流程: app从app store 获取产品信息 用户选择需要购买的产品 app发送支付请求到app store app store 处理支 ...
- Unity苹果(iOS)内购接入(Unity内置IAP)
https://www.jianshu.com/p/4045ebf81a1c Unity苹果(iOS)内购接入(Unity内置IAP) Kakarottog ...
- iOS 内购遇到的坑
一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 原因: 当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购 ...
- 苹果IOS内购二次验证返回state为21002的坑
项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...
- iOS 内购相关
iOS 内购相关 下面总结一下过往订阅和内购的项目的代码方面的实现细节和注意事项,特别是掉单方面的处理. 后台的协议.商品ID.银行卡.内购类型.沙盒账号测试人员都由运营或者产品在苹果后台中申请处理. ...
- iOS 内购讲解
一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银 ...
- IOS内购--后台PHP认证
参考网址:https://blog.csdn.net/que_csdn/article/details/80861408 http://www.php.cn/php-weizijiaocheng-39 ...
- IOS - 内购
内购的五种产品类别 •非消耗品(Nonconsumable)买了就有,头衔,功能 –指的是在游戏中一次性购买并拥有永久访问权的物品或服务.非消耗品物品可以被用户再次下载,并且能够在用户的所有设备上使用 ...
随机推荐
- mybaits in
mybatis中的in: <select id="getByInventoryIds" resultMap="beanMap"> SELECT * ...
- HttpServletRequest中得到各种信息
1.获得domain: StringBuffer url = request.getRequestURL(); String domain = url.delete(url.length() - re ...
- C++实现双缓冲
首先声明下,这篇资料也是整理别人的资料的基础上,总结来的. 在图形图像处理过程中,双缓冲技术是一种比较常见的技术.窗体在响应WM_PAINT消息时,需要对图像进行绘制处理.如果图像绘制次数过多,重绘过 ...
- iOS FMDB 不需要关闭
以前做了一个应用,里面用到了FMDB,进行每一次操作前,都open,完成操作后都close.因为我是参考他们以前的代码.程序初期没发现什么问题,程序完成后,各种卡顿就出现了!即使我是放在新线程里操作的 ...
- redis+crontab+php异步处理任务
2016年1月8日 16:08:43 星期五 情景: 用户登录日志, 发邮件, 发短信等等实时性要求不怎么高的业务通常会异步执行 之前接触过几种redis+crontab配套的实现方法, 比如: cr ...
- Linux基础命令总结
1.pwd 查看当前工作目录 2.ls [目录] 列出指定目录下的所有文件,使用 ls -l 或者 ll 列出文件详细列表包括权限.大小等文件默认大小以字节B为单位,目录大小为4096B ls - ...
- java web 学习 --第一天(Java三级考试)
1.Servlet servlet是运行在web server或 application server端的Java程序,主要用于在服务器端产生动态内容. servlet 在服务器端主要有以下作用 读取 ...
- 无IDE时编译和运行Java
最近 Java subreddit 出现了一篇”在没有IDE的情况下编译Java包” 的帖子,这个帖子抛出了这么一个问题,“是否存在一个命令可以编译一组处于同一文件夹下独立包内的java文件的方法(这 ...
- xdebug安装
sudo apt-get install php-pearsudo apt-get install php5-devsudo pecl install xdebug 下载安装编译完后,在php.ini ...
- DREAMWEAVER
女孩儿!!!Coding之路,你没有什么不一样的!!!! 1024,程序员的节日,开会的时候,你对负责人说今天是我们的节日哎~~结果,得到的是负责人冷冰冰的眼神:“你还真把自己当程序员了!?” 一阵愣 ...