[Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试
本文将演示如何为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 }