• In-App Purchase


    如果你的开发者账号中未进行过IAP相关设置,那么首先要进入iTunes Connect中,点击Contract, Tax, and Banking提交付费合约申请,需要完善的信息有:Contact Info, Bank Info, Tax Info. Bank info填写收款银行帐户。信息提交以后,审核会在24小时内完成,等这些信息都审核通过之后,你就可以进行开始实现IAP功能了。

    我们首先需要在iTunes Connect中设置一些计费点,即product.
    苹果支持5中product类型:
    1.消耗类
    2.非消耗类
    3.自动订阅:
    4.免费订阅
    5非自动订阅

    在开始购买流程之前,先要保证:
    1.网络可用
    Reachability *reach = [Reachability reachabilityInternetConnection];
    NetworkStatus netStatus = [reach currentReachabilityStatus];
    if (netStatus == NotReachable)
    {
         //Network disabled
    }
    2.购买权限
    如果在设备的访问限制中心禁止了应用程序内购买,则不可进行内购
    if (![SKPaymentQueue canMakePayments])
    {
         //IAP disabled
    }


    在此创建一个辅助类,遵循两个代理:SkProductsRequestDelegate, SKPaymentTransactionObserver
    添加属性:
    @property (retain) NSSet *productIdentifiers;
    @property (retain) NSArray *products;
    @property (retain) NSMutableSet *purchaseProducts;
    @property (retain) SKProductsRequest *request;


    由商品对应的Identifier获取商品信息(建议把所有商品的Identifier保存在服务器中,方便扩展)
    - (void)requestProducts:(NSString *)productIdentifier
    {
         NSSet *productIdentifiers = [NSSet setWithObjects:productIdentifier, nil];

         self.request = [[[SKProductsRequest alloc] initWithProductidentifiers:productIdentifiers] autorelease]; 
         request.delegate = self;
         [request start];
    }

    #program mark -
    #program mark SKProductsRequestDelegate
    - (void)prodcutsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    {
         self.products = response.products;
         SKProduct *product = [self.product objectAtIndex:0];
         self.request = nil;
         SKPayment *payment = [SKPayment paymentWithProduct:product];
         [[SKPaymentQueue defaultQueue] addPayment:payment];
    }

    SKPayment
    + (id)paymentWithProductIdentifier:(NSString *)identifier    //根据Product的Identifier购买,此方法已弃用

    - (id)paymentWithProduct:(SKProduct *)product  //先用 +paymentWithProduct获取可用的商品,用商品购买


    SKPaymentQueue:
    - addTransactionObserver:
    - removeTransactionObserver:


    SKPayment *payment = [SKPayment paymentWithProduct:product];
    [[SKPaymentQueue defaultQueue] addPayment:payment];   //加入付款队列

    #program mark -
    #program mark SKPaymentTransactionObserver
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
    {
         for (SKPaymentTransaction *transactions)
         {
              switch (transaction.transactionState)
              {
                   case SKPaymentTransactionStatePurchased:
                             break;
                   case SKPaymentTransactionStateFailed:
                             break;
                   case SKPaymentTransactionStateRestored:
                             break;
                   default:
                             break;
              }
         }
    }


    IAP测试可能遇到的问题:
    1.提示“You've already purchased this In-App Purchase but it hasn't been downloaded.”
    交易结束后没有调用[SKPaymentQueue finishTransaction]将交易从支付队列中移出,不管支付成功还是失败都应调用此方法,校验成功或失败后也应该调用此方法。
    2.获取不到product信息,数量为0
    越狱的机器限制了IAP,针对越狱的机器应该使用第三方支付平台。



  • 相关阅读:
    JavaScript 学习16.简化对象写法 上海
    JavaScript 学习11.字符串 String 对象 上海
    JavaScript 学习12.模板字符串(Template Strings) 上海
    JavaScript 学习10.使用const声明常量 上海
    JavaScript 学习9.使用let声明变量 上海
    JavaScript 学习13.Set 集合对象 上海
    一文讲透为Power Automate for Desktop (PAD) 实现自定义模块 附完整代码
    是时候使用 YAML 来做配置或数据文件了
    在博客文章中使用mermaid 定义流程图,序列图,甘特图
    .netcore+vue 实现压缩文件下载
  • 原文地址:https://www.cnblogs.com/james1207/p/3347990.html
Copyright © 2020-2023  润新知