目錄:[Swift]Xcode實際操做html
本文將演示如何爲IAP(支付方式)內購功能的具體實現和測試。ios
內購是蘋果市場上的一種常見的盈利方式。git
在項目中確保已經安裝了第三方庫【Pod】,雙擊【Podfile】查看安裝配置文件。github
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
根據配置文件中的相關設置,安裝第三方庫,雙擊打開項目文件。swift
在項目導航區,打開視圖控制器的代碼文件【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 實際操做]9、實用進階-(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 }