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. irssi忽略退出,加入消息

    IRSSI: IGNORE JOINS, PARTS, QUITS AND NICKS MESSAGES I use IRC on a daily basis and my client of cho ...

  2. 压测 apache ab 初探

    2015年10月30日 14:58:34 ab是apache自带的压测命令, 在其bin目录下边, 不仅可以压测Apache, 也可以测nginx或其他服务器 可以模拟上传post值 (-p, 与下边 ...

  3. php调用c/c++的一种方式

    php调用c/c++有很多方式,最常用的是通过tcp或者http去调用,通过发送请求去调用c/c++编写的cgi/fastcgi来实现,另外php还有一种直接执行外部应用程序的方式,这种方式会影响到系 ...

  4. ecshop修改后台访问地址

    本文转自‘做个好男人’的博客. 打开data/config.php,找到define(’ADMIN_PATH’,’admin’),这里是定义后台目录的地方,把其中的admin换成你的后台自定义目录,如 ...

  5. Effective C++ -----条款29:为“异常安全”而努力是值得的

    异常安全函数(Exception-safe functions)即使发生异常也不会泄露资源或允许任何数据结构败坏.这样的函数区分为三种可能的保证:基本型.强烈型.不抛异常型. “强烈保证”往往能够以c ...

  6. Cuckoo for Hashing_双哈希表

    问题 B: Cuckoo for Hashing 时间限制: 1 Sec  内存限制: 64 MB提交: 24  解决: 12[提交][状态][讨论版] 题目描述 An integer hash ta ...

  7. 【leetcode】triangle(easy)

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  8. 【leetcode】Sum Root to Leaf Numbers(hard)

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  9. EF性能调优

    首先说明下: 第一次运行真是太慢了,处理9600多个员工数据,用了81分钟!! 代码也挺简单,主要是得到数据-->对比分析-->插入分析结果到数据库.用的是EF的操作模式. public ...

  10. 25个增强iOS应用程序性能的提示和技巧(高级篇)(1)

    25个增强iOS应用程序性能的提示和技巧(高级篇)(1) 2013-04-16 14:56 破船之家 beyondvincent 字号:T | T 在开发iOS应用程序时,让程序具有良好的性能是非常关 ...