目录:[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 }