内购(应用内购买)

  • 通过苹果应用程序商店有三种主要赚钱的方式:
    直接收费(与国内大部分用户的消费习惯相悖)
    广告(O2O->Online推广&Office交易 闭环)
    内购:应用程序本身的增值产品,游戏装备,应用程序中增值功能同样可以内购(37开)
    第三方支付:跟应用程序无关

  • 内购的物种产品类型
    非消耗品(Nonconsumable)一旦购买,终身拥有
    消耗品(Consumable)用了就没了
    ISBN:每本书有一个ID(免费订阅 自动续费订阅 非自动续费订阅)

  • 内购(手机不能越狱)
    开发者账号
    真机调试
    配置App
    在苹果中添加银行账户
    内购测试账号

内购流程

//导入内购框架
#import <StoreKit/StoreKit.h>
#pragma mark -  1.向苹果请求可以卖的数据
//实现代理<SKProductsRequestDelegate>

    //1.1获取文件路径
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"products.json" withExtension:nil];
    //1.2获取json文件
    NSData *data = [NSData dataWithContentsOfURL:url];
    //1.3转换json数据
    NSArray *products = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    //1.4KVC直接复制
    NSArray *productIDs = [products valueForKey:@"productId"];
//    NSLog(@"%@",productIDs);
    //1.5获取产品请求对象
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIDs]];
    //1.6设置代理
    request.delegate = self;
    //1.7开始请求
    [request start];
#pragma mark - 2.苹果返回可以销售的商品
//可销售商品
@property (nonatomic,strong)NSArray *products;
//--------------------------------------------------
//当苹果返回可销售商品时调用
//response:返回的内容
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    for (SKProduct *product in response.products) {
        NSLog(@"商品描述:%@,商品名称:%@,商品价格:%@,商品ID:%@",product.localizedDescription,product.localizedTitle,product.price,product.productIdentifier);
    }
    //记录商品
    self.products = response.products;
    //刷新表格
    [self.tableView reloadData];
}
#pragma mark - 3.展示商品
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.products.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *ID = @"cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID forIndexPath:indexPath];
    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
    }
    //赋值
    SKProduct *product = self.products[indexPath.row];
    cell.textLabel.text = product.localizedTitle;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@",product.price];
    
    return  cell;
}
#pragma mark -  4.选择商品
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    //获取用户选择的商品
    SKProduct *product = self.products[indexPath.row];
}
#pragma mark -  5.包装成交易,加入队列
    //将商品包装成交易
    SKPayment *payment = [SKPayment paymentWithProduct:product];
    //将交易加入队列
    [[SKPaymentQueue defaultQueue] addPayment:payment];
#pragma mark - 6.监听队列的改变
//遵循协议<SKPaymentTransactionObserver>
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
#pragma mark - 7.付款(不需要关注)
#pragma mark - 8.交易状态更新,获取用户付款状态
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
    for (SKPaymentTransaction *transaction in transactions) {
        //判断付款状态
        /*
         SKPaymentTransactionStatePurchasing 交易已被添加到队列
         SKPaymentTransactionStatePurchased  交易已经付款成功,客户端需要完成交易
         SKPaymentTransactionStateFailed     交易再被添加到服务队列之前失败或被取消
         SKPaymentTransactionStateRestored   交易被恢复,客户端需要完成交易
         SKPaymentTransactionStateDeferred   交易状态不确定
         */
        if(transaction.transactionState == SKPaymentTransactionStatePurchased) {
            NSLog(@"交易成功,提供增值服务");
#pragma mark - 9.提供增值服务,结束交易
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }
        if(transaction.transactionState == SKPaymentTransactionStateRestored){
            NSLog(@"交易被恢复,提供增值服务");
            [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
        }
    }
}
#pragma mark - 恢复交易
-(void)restore{
    //恢复所有的交易(非消耗)
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 内购——应用内购买 通过苹果应用程序商店有三种主要赚钱的方式: 直接收费(与国内大部分用户的消费习惯相悖) 广告 ...
    JonesCxy阅读 855评论 1 2
  • 内购——应用内购买 通过苹果应用程序商店有三种主要赚钱的方式: 直接收费(与国内大部分用户的消费习惯相悖) ...
    Hevin_Chen阅读 834评论 0 0
  • zhun#1.通过苹果应用程序商店有三种主要赚钱的方式:(1)直接收费(与国内大部分用户的消费习惯相悖)(2)广告...
    阿凡提说AI阅读 484评论 0 0
  • 审核的参考资料https://developer.apple.com/icloud/documentation/d...
    iYeso阅读 3,427评论 0 4
  • 一.真机调试 1.什么是真机调试? 简单理解就是将App项目运行到真机上进行测试. 2.真机调试的必要 真机和模拟...
    夏天不冷阅读 1,150评论 0 7