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. Failed to issue method call: Unit httpd.service failed to load: No such file or directory.

    centos7修改httpd.service后运行systemctl restart httpd.service提示 Failed to issue method call: Unit httpd.s ...

  2. Windows下安装Maven

    上篇文章刚说到Linux下安装maven的过程,有时候为了适合在本地构建项目开发,然后上传到远程服务器执行,需要在本地构建maven项目,那么一般就是在Windows下构建maven项目并导入到我们的 ...

  3. markdown 基本语法

    代码块: ```console.log(1);```--- 标题: # h1## h2### h3 --- 粗斜体: *斜体***粗体*****粗斜体*** --- 强调:`强调` --- 链接:[百 ...

  4. Match:Period(POJ 1961)

    Period 题目大意:给定一个字符串,要你找到前缀重复了多少次 思路,就是kmp的next数组的简单应用,不要修正next的距离就好了,直接就可以跳转了 PS:喝了点酒用递归实现除法和取余了...结 ...

  5. 【QT】C++ GUI Qt4 学习笔记1

    Find对话框实现 平台 Qt5.3.2 MinGW4.8.2 注意创建时用QDialog finddialog.h #ifndef FINDDIALOG_H #define FINDDIALOG_H ...

  6. 【opencv】图片标注文字

    IplImage* pstImg; HI_CHAR as8Title[25];CvFont stTimeFont;//字体信息cvInitFont(&stTimeFont,CV_FONT_HE ...

  7. iOS进阶面试题----多线程

    1 多线程是什么 多线程是个复杂的概念,按字面意思是同步完成多 项任务,提高了资源的使用效率,从硬件.操作系统.应用软件不同的角度去看,多线程被赋予不同的内涵,对于硬件,现在市面上多数的CPU都是多核 ...

  8. UICollectionView cellForItemAtIndexPath 方法不走

    在storyboard 中 UICollectionView cellForItemAtIndexPath not called 被坑了好久,各种问题点查找,终于解决了 解决办法: self.auto ...

  9. 忘记Mysql登录密码

    1,使用安全模式跳过验证: 如果 Mysql在运行,Kill掉. 如果mysqld_safe无法启动,可用管理员权限sudo . 2,本地登录: 启动Mysql 3,修改密码: 5.7之后, 更改密码 ...

  10. 项目配置laungchImage