[Xcode 實際操做]9、實用進階-(31)爲IAP(支付方式)內購功能的具體實現和測試

目錄:[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 }
相關文章
相關標籤/搜索