1. 程式人生 > >[Swift通天遁地]四、網路和執行緒-(15)程式內購功能

[Swift通天遁地]四、網路和執行緒-(15)程式內購功能

本文將演示使用開源類庫往專案中新增內購功能。內購功能需要在真機上進行測試。

內購是蘋果市場上的一種常見的盈利模式。

首先確保在專案中已經安裝了所需的第三方庫。

點選【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】

現在開始編寫程式碼,實現程式內購的功能。

  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 }