132 lines
4.4 KiB
Swift
132 lines
4.4 KiB
Swift
|
|
//
|
|||
|
|
// StoreKitStateConverter.swift
|
|||
|
|
// StoreKit2Manager
|
|||
|
|
//
|
|||
|
|
// Created by xiaopin on 2025/12/6.
|
|||
|
|
//
|
|||
|
|
|
|||
|
|
import Foundation
|
|||
|
|
import StoreKit
|
|||
|
|
|
|||
|
|
/// StoreKitState 转换器
|
|||
|
|
/// 将 StoreKitState 对象转换为可序列化的基础数据类型(Dictionary/JSON)
|
|||
|
|
public struct StoreKitStateConverter {
|
|||
|
|
|
|||
|
|
/// 将 StoreKitState 转换为 Dictionary(可序列化为 JSON)
|
|||
|
|
/// - Parameter state: StoreKitState 对象
|
|||
|
|
/// - Returns: Dictionary 对象,包含状态信息
|
|||
|
|
public static func toDictionary(_ state: StoreKitState) -> [String: Any] {
|
|||
|
|
var dict: [String: Any] = [:]
|
|||
|
|
|
|||
|
|
switch state {
|
|||
|
|
case .idle:
|
|||
|
|
dict["type"] = "idle"
|
|||
|
|
|
|||
|
|
case .loadingProducts:
|
|||
|
|
dict["type"] = "loadingProducts"
|
|||
|
|
|
|||
|
|
// case .productsLoaded(let products):
|
|||
|
|
// dict["type"] = "productsLoaded"
|
|||
|
|
// dict["products"] = ProductConverter.toDictionaryArray(products)
|
|||
|
|
|
|||
|
|
case .loadingPurchases:
|
|||
|
|
dict["type"] = "loadingPurchases"
|
|||
|
|
|
|||
|
|
case .purchasesLoaded:
|
|||
|
|
dict["type"] = "purchasesLoaded"
|
|||
|
|
|
|||
|
|
case .purchasing(let productId):
|
|||
|
|
dict["type"] = "purchasing"
|
|||
|
|
dict["productId"] = productId
|
|||
|
|
|
|||
|
|
case .purchaseSuccess(let productId):
|
|||
|
|
dict["type"] = "purchaseSuccess"
|
|||
|
|
dict["productId"] = productId
|
|||
|
|
|
|||
|
|
case .purchasePending(let productId):
|
|||
|
|
dict["type"] = "purchasePending"
|
|||
|
|
dict["productId"] = productId
|
|||
|
|
|
|||
|
|
case .purchaseCancelled(let productId):
|
|||
|
|
dict["type"] = "purchaseCancelled"
|
|||
|
|
dict["productId"] = productId
|
|||
|
|
|
|||
|
|
case .purchaseFailed(let productId, let error):
|
|||
|
|
dict["type"] = "purchaseFailed"
|
|||
|
|
dict["productId"] = productId
|
|||
|
|
dict["error"] = String(describing: error)
|
|||
|
|
|
|||
|
|
// case .subscriptionStatusChanged(let renewalState):
|
|||
|
|
// dict["type"] = "subscriptionStatusChanged"
|
|||
|
|
// dict["renewalState"] = renewalStateToString(renewalState)
|
|||
|
|
|
|||
|
|
case .restoringPurchases:
|
|||
|
|
dict["type"] = "restoringPurchases"
|
|||
|
|
|
|||
|
|
case .restorePurchasesSuccess:
|
|||
|
|
dict["type"] = "restorePurchasesSuccess"
|
|||
|
|
|
|||
|
|
case .restorePurchasesFailed(let error):
|
|||
|
|
dict["type"] = "restorePurchasesFailed"
|
|||
|
|
dict["error"] = String(describing: error)
|
|||
|
|
|
|||
|
|
case .purchaseRefunded(let productId):
|
|||
|
|
dict["type"] = "purchaseRefunded"
|
|||
|
|
dict["productId"] = productId
|
|||
|
|
|
|||
|
|
case .purchaseRevoked(let productId):
|
|||
|
|
dict["type"] = "purchaseRevoked"
|
|||
|
|
dict["productId"] = productId
|
|||
|
|
|
|||
|
|
case .subscriptionCancelled(let productId, let isFreeTrialCancelled):
|
|||
|
|
dict["type"] = "subscriptionCancelled"
|
|||
|
|
dict["productId"] = productId
|
|||
|
|
dict["isFreeTrialCancelled"] = isFreeTrialCancelled
|
|||
|
|
|
|||
|
|
case .error(let error):
|
|||
|
|
dict["type"] = "error"
|
|||
|
|
dict["error"] = String(describing: error)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return dict
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 将 StoreKitState 转换为 JSON 字符串
|
|||
|
|
/// - Parameter state: StoreKitState 对象
|
|||
|
|
/// - Returns: JSON 字符串
|
|||
|
|
public static func toJSONString(_ state: StoreKitState) -> String? {
|
|||
|
|
let dict = toDictionary(state)
|
|||
|
|
return dictionaryToJSONString(dict)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// MARK: - 私有方法
|
|||
|
|
|
|||
|
|
/// 续订状态转字符串
|
|||
|
|
private static func renewalStateToString(_ state: Product.SubscriptionInfo.RenewalState) -> String {
|
|||
|
|
switch state {
|
|||
|
|
case .subscribed:
|
|||
|
|
return "subscribed"
|
|||
|
|
case .expired:
|
|||
|
|
return "expired"
|
|||
|
|
case .inBillingRetryPeriod:
|
|||
|
|
return "inBillingRetryPeriod"
|
|||
|
|
case .inGracePeriod:
|
|||
|
|
return "inGracePeriod"
|
|||
|
|
case .revoked:
|
|||
|
|
return "revoked"
|
|||
|
|
default:
|
|||
|
|
return "unknown"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// Dictionary 转 JSON 字符串
|
|||
|
|
private static func dictionaryToJSONString(_ dict: [String: Any]) -> String? {
|
|||
|
|
guard let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted),
|
|||
|
|
let jsonString = String(data: jsonData, encoding: .utf8) else {
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
return jsonString
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|