zoukankan      html  css  js  c++  java
  • iOS 内购补充点

    转载请注明出处!!!

    1、关于支付类型的选择

    (1)消耗型物品:用一次,使用后失效,商品会在使用中一点一点消耗,这里最多使用的是游戏道具之类.游戏中内购大多使用这个,还有直播送礼物等等;

    (2)非消耗型物品:最最坑爹的一种,这个不依赖自己服务器,只和苹果appid联系,只要同一个id购买,即使100个设备同时用这个id登录,都不需要进行再次购买,而且苹果强制要求要有一个Restore Purchases button,这个按钮的主要作用是恢复之前的购买.(appstore上面收费软件的下载就是这种类型)

    附上这种类型的处理方法:

    开发中有2种方案:

    一种是直接在购买按钮下面添加一个恢复购买按钮(但是你要告诉审核人员,这个按钮在哪,发图片或者视频给审核人员,这种方便最简单,但是显示不好)

    一种是通过获取该appid下面购买过的商品,然后在判断该商品是否在购买过的商品列表中,如果有,显示回复购买按钮,如果没有显示购买按钮.

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        if ([SKPaymentQueue canMakePayments]) {
            //用户允许app内购
            if (productId.length) {
                NSArray *product = [[NSArray alloc]initWithObjects:@"商品id", nil];
                NSSet *set = [NSSet setWithArray:product];
                SKProductsRequest *productRequest =[[SKProductsRequest alloc] initWithProductIdentifiers:set];
                productRequest.delegate = self;
                [productRequest start];
            } else { //商品id为空
               
            }
        }else{ //不支持购买
            
        }
    #pragma mark SKProductsRequestDelegate 查询成功后的回调
    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { NSArray *product = response.products;
        if (product.count == 0) { //无法获取商品信息
            
        }else{ //发起购买请求
            SKPayment *payment = [SKPayment paymentWithProduct:product[0]];
            [[SKPaymentQueue defaultQueue]restoreCompletedTransactions];//这句代码就是恢复购买
        }
    }

    接下来是代理函数,在这里你可以获取到已经购买过的商品集合

    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions: (nonnull NSArray *)transactions { self.restoreArray = [[NSMutableArray alloc]init];
        for (SKPaymentTransaction *transaction in transactions) {
            switch (transaction.transactionState) {
                case SKPaymentTransactionStatePurchasing://正在交易
                    break;
                case SKPaymentTransactionStatePurchased://交易完成
                    break;
                case SKPaymentTransactionStateFailed://交易失败
                    break;
                case SKPaymentTransactionStateRestored://已经购买过该商品
                    [self.restoreArray addObject:transaction.payment.productIdentifier];
                    [self restoreTransaction:transaction];
                    break;
                default:
                    break;
            }
        }
    }
    - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
        if ([self.restoreArray containsObject:self.goodsProductId]) {
            //用户购买过商品.就应该显示"恢复购买按钮"
        }else{
            //用户没有购买过该商品
        }
    }
        

    (3)自动续期订阅:使用很少,适合报刊订阅等等

    (4)非续订型订阅:用到的比较多的,可以依赖自已服务器,可以无数次购买,没有appid限制,比如一个价格商品有很多种规格,就可以使用这个.比如网易云课堂的收费课,腾讯课堂收费课等

    2.游客模式:一般这个会是提示你5.1.1然后被拒。

    最近审核比较严格,内购的时候最好提供游客模式,即使用户没有登录,也能进行购买,不要在购买的时候,强行提示用户登录(本人因为这个被拒N次)。

    参考过的链接:

    http://www.cocoachina.com/bbs/read.php?tid-1716937.html
    http://www.cocoachina.com/bbs/read.php?tid-1720959-page-2.html
    http://www.cocoachina.com/bbs/read.php?tid=1692154
    https://developer.apple.com/app-store/review/guidelines/#data-collection-and-storage

     总结方法:

    1.我遇到过类似的,你在购买的时候提示他登录审核就会被拒绝,购买时直接跳转登录页面审核就过了。。。(容易被拒,还是看人)

    2.添加游客模式

    3.默默登录 判断是不是在审核期间 不是则跳转登录 反之默默登录 这时候需要注意的是登录后用户数据的保存

  • 相关阅读:
    DDK 的一些笔记
    C# 32位程序访问64位系统注册表
    自己对设备栈的理解
    简单驱动编写与windbg调试
    DDK 的一些笔记other
    USB设备的一些概念
    C# 32位程序与64位程序读\写注册表的区别
    dbca建库时找不到ASM磁盘
    sf01_什么是数据结构
    cPickle.dump函数
  • 原文地址:https://www.cnblogs.com/weicyNo-1/p/7561355.html
Copyright © 2011-2022 走看看