★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-wcvajtjv-kx.html
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html
目錄:[Swift]通天遁地Swiftios
本文將演示使用開源類庫往項目中添加內購功能。內購功能須要在真機上進行測試。git
內購是蘋果市場上的一種常見的盈利模式。github
首先確保在項目中已經安裝了所需的第三方庫。swift
點擊【Podfile】,查看安裝配置文件。安全
1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'SwiftyStoreKit' 7 end
根據配置文件中的相關配置,安裝第三方庫。服務器
而後點擊打開【DemoApp.xcworkspace】項目文件。微信
在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】網絡
如今開始編寫代碼,實現程序內購的功能。ide
1 import UIKit 2 //在當前的類文件中,引入已經安裝的第三方類庫。 3 import SwiftyStoreKit 4 5 class ViewController: UIViewController { 6 7 //添加一個字符串屬性,做爲內購項目的惟一標識符。 8 let productId = "com.strengthen.DemoIAPC8" 9 //添加一個字符串屬性,做爲在生成內購項目以後,所生成的安全碼。 10 let secretCode = "806a9bd7aa7f46338902a7d81b9cea6b" 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 // Do any additional setup after loading the view, typically from a nib. 15 //測試應用程序是否擁有指定的內購項目 16 getInfo() 17 18 //測試購買一個內購項目 19 purchase() 20 21 //測試恢復內購 22 restorePurchases() 23 } 24 25 //添加一個方法,用來得到當前應用程序的全部內購項目。 26 func getInfo() 27 { 28 //根據內購項目的惟一標識符, 29 //經過調用第三方類庫的獲取產品信息的方法,得到該項目詳細的信息。 30 SwiftyStoreKit.retrieveProductsInfo([productId]) 31 { 32 result in 33 //得到結果列表中第一個元素 34 if let product = result.retrievedProducts.first 35 { 36 //項目的價格 37 let priceString = product.localizedPrice! 38 //在控制檯輸出項目的惟一標識符和項目的價格 39 print("Available purchases: \(product.productIdentifier), price: \(priceString)") 40 } 41 //處理沒法得到項目的狀況 42 else if let invalidProductId = result.invalidProductIDs.first 43 { 44 //在控制檯輸出錯誤的提示信息 45 print("Could not retrieve product info, Invalid product identifier: \(invalidProductId)") 46 } 47 else 48 { 49 //處理因爲網絡請求失敗等狀況,所形成的內購查詢失敗的問題 50 print("Error: \(result.error)") 51 } 52 } 53 } 54 55 //添加另外一個方法,用來執行內購功能 56 func purchase() 57 { 58 //經過調用第三方類庫的購買產品方法,購買指定惟一標識符的內購項目。 59 SwiftyStoreKit.purchaseProduct(productId) 60 { 61 result in 62 //處理服務器返回的結果 63 switch result 64 { 65 //交易成功 66 case .success(let productId): 67 //在控制檯輸出交易成功的信息。 68 //此時應該進行一些業務操做, 69 //好比解鎖某個遊戲場景,或者將內購存儲到服務器。 70 print("Purchase Success: \(productId)") 71 72 //交易出錯 73 case .error(let error): 74 //若是在交易中出現錯誤,則在控制檯輸出交易出錯的信息。 75 print("Could not retrieve product info: \(error)") 76 } 77 } 78 } 79 80 //添加另外一個方法,用來恢復內購。 81 //若是用戶以前購買過內購的項目,當用戶從新安裝應用程序時, 82 //能夠經過此方法,恢復用戶以前購買過的項目。 83 func restorePurchases() 84 { 85 //經過調用第三方類庫的恢復全部內購的方法,得到全部購買過的項目 86 SwiftyStoreKit.restorePurchases() 87 { 88 results in 89 //若是內購恢復失敗 90 if results.restoreFailedProducts.count > 0 91 { 92 //則在控制檯輸出相應的錯誤信息 93 print("Restore Failed: \(results.restoreFailedProducts)") 94 } 95 //若是返回的可恢復內購的項目的數量大於0, 96 else if results.restoredProducts.count > 0 97 { 98 //則在控制檯輸出相應的日誌信息 99 print("Restore Success: \(results.restoredProducts)") 100 //對內購項目的列表進行遍歷 101 for product in results.restoredProducts 102 { 103 //當內購被成功恢復後, 104 //應該走和內購交易同樣的業務流程。 105 //好比解鎖某個遊戲場景,增長應用的金幣數量等。 106 print(product) 107 } 108 } 109 else 110 { 111 //處理無需恢復購買的狀況 112 print("Nothing to Restore") 113 } 114 } 115 } 116 117 //添加另外一個方法,用來驗證收據信息 118 func verifyReceipt() 119 { 120 //經過調用第三方類庫的驗證收據方法,驗證指定的安全碼。 121 SwiftyStoreKit.verifyReceipt(password: secretCode) 122 { 123 result in 124 //處理驗證失敗的狀況 125 if case .error(let error) = result 126 { 127 //若是當前沒有安全碼 128 if case .noReceiptData = error 129 { 130 //則調用刷新收據的方法 131 self.refreshReceipt() 132 } 133 } 134 } 135 } 136 137 //添加另外一個方法,用來刷新收據 138 func refreshReceipt() 139 { 140 //經過調用第三方類庫的刷新收據的方法 141 SwiftyStoreKit.refreshReceipt 142 { 143 result in 144 //對服務器返回的結果進行遍歷 145 switch result 146 { 147 //驗證成功 148 case .success: 149 print("Receipt refresh success") 150 151 //驗證失敗 152 case .error(let error): 153 print("Receipt refresh failed: \(error)") 154 } 155 } 156 } 157 158 //添加另外一個方法,用來對購買進行驗證 159 func verifyPurchase() 160 { 161 //經過調用第三方類庫的驗證收據方法 162 SwiftyStoreKit.verifyReceipt(password: secretCode) 163 { 164 result in 165 //對服務器返回的結果進行遍歷 166 switch result 167 { 168 //驗證成功 169 case .success(let receipt): 170 //當驗證成功時,執行第三方類庫的驗證購買的方法 171 let purchaseResult = SwiftyStoreKit.verifyPurchase( 172 productId: self.productId, 173 inReceipt: receipt 174 ) 175 //對服務器返回的購買驗證的結果進行遍歷 176 switch purchaseResult 177 { 178 //當內購項目被購買過期 179 case .purchased( _): 180 //在控制檯輸出內購信息 181 print("Product is purchased.") 182 183 //當內購項目未被購買過期 184 case .notPurchased: 185 //在控制檯輸出項目未被購買 186 print("The user has never purchased this product") 187 } 188 189 //驗證失敗 190 case .error(let error): 191 //在控制檯輸出驗證錯誤信息 192 print("Receipt verification failed: \(error)") 193 } 194 } 195 } 196 197 override func didReceiveMemoryWarning() { 198 super.didReceiveMemoryWarning() 199 // Dispose of any resources that can be recreated. 200 } 201 }