-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStoreManager.swift
81 lines (68 loc) · 2.89 KB
/
StoreManager.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import StoreKit
class StoreManager: NSObject, SKPaymentTransactionObserver {
static var sharedStore = StoreManager()
// product idの一覧を定義する
let productsIdentifiers: Set<String> = []
var products: [SKProduct] = []
// AppDelegateや課金処理前に呼び出してproduct一覧を取得する
static func setup() {
sharedStore.validateProductsIdentifiersWithRequest()
}
// product情報をStoreから取得
private func validateProductsIdentifiersWithRequest() {
let request = SKProductsRequest(productIdentifiers: productsIdentifiers)
request.delegate = self
request.start()
}
// 購入
func purchaseProduct(_ productIdentifier: String) {
guard let product = productForIdentifiers(productIdentifier) else { return }
let payment = SKPayment(product: product)
SKPaymentQueue.default().add(payment)
}
// 該当のproduct情報はproductsに存在するか確認
private func productForIdentifiers(_ productIdentifier: String) -> SKProduct? {
return products.filter({ (product: SKProduct) -> Bool in
return product.productIdentifier == productIdentifier
}).first
}
// transactionsが変わるたびに呼ばれる
func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
switch transaction.transactionState {
case .purchasing:
break
case .purchased:
completeTransaction(transaction)
case .restored:
restoreTransaction(transaction)
case .deferred:
break
case .failed:
failedTransaction(transaction)
default:
break
}
}
}
private func completeTransaction(_ transaction: SKPaymentTransaction) {
// レシートの検証や課金後の必要な処理を完了してからトランザクションを閉じること
}
private func restoreTransaction(_ transaction: SKPaymentTransaction) {
// レシートの検証や課金後の必要な処理を完了してからトランザクションを閉じること
}
private func failedTransaction(_ transaction: SKPaymentTransaction) {
// トランザクションの終了処理
SKPaymentQueue.default().finishTransaction(transaction)
}
func finishTransaction(_ transaction: SKPaymentTransaction) {
// トランザクションの終了処理
SKPaymentQueue.default().finishTransaction(transaction)
}
}
extension StoreManager: SKProductsRequestDelegate {
// product情報の取得完了
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
products = response.products
}
}