news 2026/4/14 18:30:10

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 18:26:33

当GStreamer遇到v4l2:Ubuntu系统USB摄像头开发避坑大全(附常用命令清单)

GStreamer与v4l2深度整合:Ubuntu USB摄像头开发实战指南 在视频应用开发领域,GStreamer框架与v4l2工具链的结合为开发者提供了强大的视频处理能力。本文将深入探讨如何利用这套技术栈解决实际开发中的各类问题,从硬件兼容性验证到性能调优&am…

作者头像 李华
网站建设 2026/4/14 18:21:19

ST7789显示屏驱动完全指南:STM32硬件SPI与DMA优化终极教程

ST7789显示屏驱动完全指南:STM32硬件SPI与DMA优化终极教程 【免费下载链接】ST7789-STM32 using STM32s Hardware SPI to drive a ST7789 based IPS displayer 项目地址: https://gitcode.com/gh_mirrors/st/ST7789-STM32 在嵌入式系统开发中,高效…

作者头像 李华
网站建设 2026/4/14 18:14:57

西安交通大学学位论文LaTeX模板:3步快速上手终极指南

西安交通大学学位论文LaTeX模板:3步快速上手终极指南 【免费下载链接】XJTU-thesis 西安交通大学学位论文模板(LaTeX)(适用硕士、博士学位)An official LaTeX template for Xian Jiaotong University degree thesis (C…

作者头像 李华
网站建设 2026/4/14 18:13:08

动手学深度学习——GRU代码

1. 前言上一篇我们已经从原理上认识了 GRU(门控循环单元):它是对基础 RNN 的改进它引入了门控机制它通过更新门和重置门来控制信息流它更擅长处理长期依赖问题但是,只理解公式还不够。 和前面 RNN 一样,真正把 GRU 学扎…

作者头像 李华