uni离线打包实现 ios 支付StoreKit 2,其实没有想象中那么复杂,不需要写原生插件,不需要转 uts
我走的是原生桥接方法
- 在 uni 原生工程项目下新增两个 swift 文件
- IAPBridge.swift
- IAPManager.swift
具体两个文件内容如下
IAPBridge.swift
import Foundation @objc(IAPBridge) class IAPBridge: NSObject { private var lastResult: String = "" @objc func getLastResult() -> String { return lastResult } private func runPurchase(productId: String, uuid: String, callback: @escaping (Any?) -> Void) { print("[IAP][原生][桥接] 开始购买流程, productId=\(productId), uuid=\(uuid)") let unitSep = "\u{001e}" let paramBlob = productId + unitSep + uuid print("[IAP][原生][桥接] 设置参数并启动购买") IAPManager.shared.setPurchaseParamBlob(paramBlob) IAPManager.shared.startPurchaseFlow() DispatchQueue.global().async { print("[IAP][原生][桥接] 开始等待购买结果") let result = IAPManager.shared.waitPurchaseResultMs(120000) print("[IAP][原生][桥接] 等待结果返回=\(result)") self.lastResult = result DispatchQueue.main.async { print("[IAP][原生][桥接] 回调给 JS") // 强制桥接为 NSString,避免部分基座把 Swift.String 透传成 undefined callback(result as NSString) } } } /// JS 调用入口 @objc func purchase(_ params: NSDictionary, callback: @escaping (Any?) -> Void) { print("[IAP][原生][桥接] purchase 被调用, params=\(params)") guard let productId = params["productId"] as? String, !productId.isEmpty else { print("[IAP][原生][桥接] 缺少 productId") callback("error: missing productId") return } guard let uuid = params["uuid"] as? String, !uuid.isEmpty else { print("[IAP][原生][桥接] 缺少 uuid") callback("error: missing uuid") return } runPurchase(productId: productId, uuid: uuid, callback: callback) } /// JS 兜底入口:避免 NSDictionary 桥接或 selector 解析失败 @objc func purchaseWithProductId(_ productId: String, uuid: String, callback: @escaping (Any?) -> Void) { print("[IAP][原生][桥接] purchaseWithProductId 被调用, productId=\(productId), uuid=\(uuid)") guard !productId.isEmpty else { callback("error: missing p