[Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试

目录:[Swift]Xcode实际操作

本文将演示如何为IAP(支付方式)内购功能的具体实现和测试。

内购是苹果市场上的一种常见的盈利方式。

在项目中确保已经安装了第三方库【Pod】,双击【Podfile】查看安装配置文件。

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

根据配置文件中的相关设置,安装第三方库,双击打开项目文件。

在项目导航区,打开视图控制器的代码文件【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 实际操作]九、实用进阶-(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 }
原文地址:https://www.cnblogs.com/strengthen/p/10110699.html