• [Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试


    目录:[Swift]Xcode实际操作

    本文将演示如何为IAP(支付方式)内购功能的具体实现和测试。

    内购是苹果市场上的一种常见的盈利方式。

    在项目中确保已经安装了第三方库【Pod】,双击【Podfile】查看安装配置文件。

    1 platform :ios, '9.0'
    2 use_frameworks!
    3 
    4 target 'DemoApp' do
    5     source 'https://github.com/CocoaPods/Specs.git'
    6     pod 'SwiftyStoreKit'
    7 end

    根据配置文件中的相关设置,安装第三方库,双击打开项目文件。

    在项目导航区,打开视图控制器的代码文件【ViewController.swift】

    内购项目需要在真机上进行测试。

      1 import UIKit
      2 //在当前的类文件中,引入已经安装的第三方类库SwiftyStoreKit
      3 import SwiftyStoreKit
      4 
      5 class ViewController: UIViewController {
      6     
      7     //添加一个字符串属性,作为内购项目的唯一标识符。
      8     let productId = "com.strengthen.DemoIAP"
      9     //添加一个字符串属性,在生成内购项目之后,所生成的共享密钥。
     10     let secretCode = "806a9bd7aa7f46338902a7d81b9cea6b"
     11     //点击查看[内购项目的唯一标识符][内购项目安全码]:[Xcode10 实际操作]九、实用进阶-(29)为App添加IAP(支付方式)内购项目https://www.cnblogs.com/strengthen/p/10110462.html
     12     
     13     override func viewDidLoad() {
     14         super.viewDidLoad()
     15         // Do any additional setup after loading the view, typically from a nib.
     16         //依次调用和测试各个方法
     17 
     18         //运行程序时,会弹出登录对话框
     19         //要购买内购产品,需要登录沙箱测试账号
     20         //获取当前的应用程序的所有内购项目
     21         getInfo()
     22         //购买一个内购项目
     23         purchase()
     24         //恢复内购项目
     25         restorePurchases()
     26     }
     27     
     28     //添加一个方法,用来获取当前的应用程序的所有内购项目
     29     func getInfo()
     30     {
     31         //根据为内购项目的唯一标识符,通过调用第三方类库的获取产品信息方法,
     32         //获得该项目详细的信息。
     33         SwiftyStoreKit.retrieveProductsInfo([productId])
     34         { 
     35             result in
     36             //h获得结果列表中的第一个元素,
     37             if let product = result.retrievedProducts.first
     38             {
     39                 //项目的价格
     40                 let priceString = product.localizedPrice!
     41                 //在控制台输出项目的唯一标识符和项目的价格
     42                 print("Available purchases: (product.productIdentifier), price: (priceString)")
     43             }
     44             //处理无法获得项目的情况
     45             else if let invalidProductId = result.invalidProductIDs.first
     46             {
     47                 //在控制台输出日志信息
     48                 print("Could not retrieve product info, Invalid product identifier: (invalidProductId)")
     49             }
     50             //最后处理由于网络请求失败等情况,所造成的内购查询失败的问题。
     51             else
     52             {
     53                 //在控制台输出日志信息
     54                 print("Error: (String(describing: result.error))")
     55             }
     56         }
     57     }
     58     
     59     //添加一个方法,用来执行内购功能
     60     func purchase()
     61     {
     62         //通过调用第三方类库的购买产品的方法,购买指定唯一标识符的内购项目
     63         SwiftyStoreKit.purchaseProduct(productId)
     64         { 
     65             result in
     66             //处理服务器返回的结果
     67             switch result
     68             {
     69                 //交易成功,此时应该进行一些业务操作,
     70                 //比如解锁某个游戏场景,或者将内购存储到服务器。
     71                 case .success(let productId):
     72                     //这里选择输出内购成功的日志
     73                     print("Purchase Success: (productId)")
     74                 
     75                 //如果在交易中出现错误
     76                 case .error(let error):
     77                     //则在控制台输出交易出错的信息
     78                     print("Could not retrieve product info: (error)")
     79             }
     80         }
     81     }
     82     
     83     //添加一个方法,用来恢复内购。
     84     //如果用户之前购买过内购的项目,当用户重新安装应用程序时,
     85     //可以通过此方法,恢复用户之前购买过的项目。
     86     func restorePurchases()
     87     {
     88         //通过调用第三方类库的恢复所有内购的方法,获得所有购买过的项目。
     89         SwiftyStoreKit.restorePurchases()
     90         { 
     91             results in
     92             //如果内购恢复失败,恢复内购失败的项目的数量大于0
     93             if results.restoreFailedProducts.count > 0
     94             {
     95                 //则在控制台输出相应的错误信息
     96                 print("Restore Failed: (results.restoreFailedProducts)")
     97             }
     98             //如果返回的可恢复内购的项目的数量大于0
     99             else if results.restoredProducts.count > 0
    100             {
    101                 //则在控制台输出相应的错误信息
    102                 print("Restore Success: (results.restoredProducts)")
    103                 //接着对内购项目列表进行遍历。
    104                 //当内购被成功恢复后,
    105                 //应该走和内购交易一样的业务流程,
    106                 //比如解锁某个游戏场景,增加用户的金币数量等
    107                 for product in results.restoredProducts
    108                 {
    109                     //则在控制台输出相应的日志
    110                     print(product)
    111                 }
    112             }
    113             else
    114             {
    115                 //最后处理无需购买的情况
    116                 print("Nothing to Restore")
    117             }
    118         }
    119     }
    120     
    121     //添加一个方法,用来验证收据信息
    122     func verifyReceipt()
    123     {
    124         //通过调用第三方类库的验证收据方法,验证指定的安全码
    125         SwiftyStoreKit.verifyReceipt(password: secretCode)
    126         { 
    127             result in
    128             //首先处理验证失败的情况
    129             if case .error(let error) = result
    130             {
    131                 //假如当前没有安全码
    132                 if case .noReceiptData = error
    133                 {
    134                     //则调用刷新收据的方法。
    135                     self.refreshReceipt()
    136                 }
    137             }
    138         }
    139     }
    140     
    141     //添加一个方法,用来实现刷新收据的功能
    142     func refreshReceipt()
    143     {
    144          //通过调用第三方类库的刷新收据的方法
    145         SwiftyStoreKit.refreshReceipt
    146         { 
    147             result in
    148              //对服务器返回的结果进行遍历
    149             switch result
    150             {
    151                 //成功
    152                 case .success:
    153                     //输出成功信息
    154                     print("Receipt refresh success")
    155                 //失败
    156                 case .error(let error):
    157                     //输出失败信息
    158                     print("Receipt refresh failed: (error)")
    159             }
    160         }
    161     }
    162     
    163     //添加一个方法,用来对购买进行验证
    164     func verifyPurchase()
    165     {
    166           //通过调用第三方类库的验证收据方法
    167         SwiftyStoreKit.verifyReceipt(password: secretCode)
    168         {
    169             result in
    170             //对服务器返回的结果进行遍历
    171             switch result
    172             {
    173                 //当验证成功时
    174                 case .success(let receipt):
    175                     //根据内购项目的唯一标识符和收据
    176                     //执行第三方类库的验证购买的方法
    177                     let purchaseResult = SwiftyStoreKit.verifyPurchase(
    178                         productId: self.productId,
    179                         inReceipt: receipt
    180                     )
    181                     //对服务器返回的购买验证的结果进行遍历
    182                     switch purchaseResult
    183                     {
    184                         //当内购项目被购买过时
    185                         case .purchased:
    186                             //则在控制台输出相应的日志
    187                             print("Product is purchased.")
    188 
    189                         //当内购项目未被购买过时
    190                         case .notPurchased:
    191                             //则在控制台输出相应的日志
    192                             print("The user has never purchased this product")
    193                     }
    194 
    195                 //如果在验证收据时出现错误
    196                 case .error(let error):
    197                     //则在控制台输出相应的日志
    198                     print("Receipt verification failed: (error)")
    199             }
    200         }
    201     }
    202     
    203     override func didReceiveMemoryWarning() {
    204         super.didReceiveMemoryWarning()
    205         // Dispose of any resources that can be recreated.
    206     }
    207 }
  • 相关阅读:
    POJ 3093 Margaritas on the River Walk(背包)
    BZOJ 2287 【POJ Challenge】消失之物(DP+容斥)
    WC2017 Day1
    WC2017 Day0
    WC2017 Conclusion
    WC2017 Day6
    UOJ #58 糖果公园
    WC2017 Day5
    codevs 1946 阿狸的打字机
    HDU 2457 DNA_repair
  • 原文地址:https://www.cnblogs.com/strengthen/p/10110699.html
Copyright © 2020-2023  润新知