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. Unity3d 解析文本执行已注册的自定函数

    最近有个需求是想让程序解析策划编辑一个文本生成一段CG,内容使用大致是这样 cgSetCameraEx(118.6324,30.71189,75.55666,45,-45,0,0) cgCloneMy ...

  2. ajax加载表格数据

    一.html代码 <style type="text/css"> .table-taskinfo table tr { border-top: 2px solid #9 ...

  3. 【编程题目】如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)

    转自:http://blog.csdn.net/vast_sea/article/details/8167968 看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSor ...

  4. 【opencv】轮廓相关

    IplImage* contours_rect; IplImage* contours; CvMemStorage* countours_storage=NULL; if(contours_rect= ...

  5. HDU 5879 Cure -2016 ICPC 青岛赛区网络赛

    题目链接 题意:给定一个数n,求1到n中的每一项的平方分之一的累加和. 题解:题目没有给数据范围,而实际上n很大很大超过long long.因为题目只要求输出五位小数,我们发现当数大到一定程度时值是固 ...

  6. Android笔记:管理所有活动

    以关闭所有活动为例 public class ActivityCollector { public static List<Activity> activities = new Array ...

  7. 解决ERROR 2003 (HY000): Can't connect to MySQL server on

    方案一: .打开cmd; .输入命令:net stop +MySQL的服务名,停止MySQL服务,如果未启动MySQL服务则可跳过该步骤: .输入命令:mysqld --remove卸载MySQL服务 ...

  8. 访问javaweb服务器sessionid存放问题

    sessionid存放在cookies里面,key是JSESSIONID

  9. cf378D(stl模拟)

    题目链接:http://codeforces.com/contest/733/problem/D 用map<pair<int, int>int>标记(第一次用~)... 代码: ...

  10. 求sqrt()底层效率问题(二分/牛顿迭代)

    偶然看见一段求根的神代码,于是就有了这篇博客: 对于求根问题,通常我们可以调用sqrt库函数,不过知其然需知其所以然,我们看一下求根的方法: 比较简单方法就是二分咯: 代码: #include< ...