[Swift通天遁地]4、網絡和線程-(15)程序內購功能

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(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 }
相關文章
相關標籤/搜索