当前位置: 首页 > news >正文

uni离线打包实现 ios 支付StoreKit 2,其实没有想象中那么复杂,不需要写原生插件,不需要转 uts

我走的是原生桥接方法

  1. 在 uni 原生工程项目下新增两个 swift 文件
    1. IAPBridge.swift
    2. 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
http://www.jsqmd.com/news/640795/

相关文章:

  • 详解TCP三次握手与四次挥手
  • Agent - Reflection
  • Chord - Ink Shadow 部署详解:Windows系统下Docker与模型环境配置
  • 成都怎么找最正宗的火锅店?美团火锅人气榜实测好用,新手也能零踩雷 - 资讯焦点
  • 别再焦虑了!小白程序员必备:收藏这份AI大模型学习资源,抢占职场先机
  • 2026乡村全科执医刷题题库深扒:这两款靠谱题库值得推荐! - 医考机构品牌测评专家
  • TranslucentTB:Windows任务栏透明美化终极指南,让你的桌面焕然一新!✨
  • 多模态大模型持续学习不是“加个Adapter”就完事:深度解析Meta新论文《Continual M3AE》中提出的跨模态原型锚定机制与3周内可部署的轻量级实现路径
  • 零基础两周拿下PCTP认证:我的TiDB数据库专家备考笔记与实战避坑指南
  • HTML打包EXE三种加密方式对比:静态密码、离线一机一码、网络验证
  • MATLAB数据清洗实战:从Excel到干净数据的完整流程(附代码)
  • 3分钟让Figma说中文:设计师专属的中文界面插件终极指南
  • AI时代软件工程师的核心能力是什么:斯坦福答案
  • 误码率实战解析:从理论到应用的全方位指南
  • 从博通官网精准获取ESXi与VM虚拟机套件的实战指南
  • 硬件调试革命:3大突破让AMD Ryzen系统稳定性提升5倍
  • Rust 是如何判断对象是否相等的?一起来聊一聊 PartialEq 与 Eq
  • 最大异或和路径
  • 终极指南:如何用缠论量化插件实现通达信精准交易分析
  • AI算法入门:深度学习六周学习计划
  • LifeNet Health|人原代肝细胞3D肝球体标准化培养实操方案【曼博生物】
  • 新手建模常见错误:面反、破面、重叠
  • 用ESP-01S和51单片机做个手机遥控灯:从AT指令配置到代码烧录的保姆级避坑指南
  • 抖音无水印批量下载神器:5分钟搞定创作者素材收集的终极指南
  • 手把手教你将大疆无人机GPS数据接入ROS:从PSDK到NavSatFix话题的保姆级封装教程
  • [技术讨论] 【每周分享】变频器驱动电路正负电压正常,波形也正常,偏偏带载就炸机
  • tsMuxer视频封装指南:3步掌握无损音视频轨道处理技术
  • Conditional Domain Adversarial Network (CDAN):从类感知对齐到实战调优
  • CasRel关系抽取详细步骤:从cd CasRel到print(result)的终端实操全记录
  • MiniCPM-o-4.5-nvidia-FlagOS保姆级教程:Linux服务器后台常驻运行+nginx反向代理配置