资讯动态

t3code跨平台CLI工具:统一构建iOS/Android/Electron应用

发布时间:2026/10/27 7:01:18 来源:尧图企业网站定制
1. 项目概述t3code 是什么它解决的到底是什么问题“t3code”这个名称乍看像一个缩写或代号但结合当前全网高频搜索词——CLI、Electron、web app、iOS、Android——它绝不是某个小众玩具项目而极大概率是一个面向跨平台原生应用开发者的命令行工具链CLI Toolchain其核心定位是用一套代码、一次配置、统一工作流生成可本地运行、具备系统级能力的桌面端Windows/macOS/Linux、移动端iOS/Android甚至 Web 端的可执行产物。它不是 Electron 的简单封装也不是 React Native 的替代品而是试图在“开发体验一致性”和“运行时能力完整性”之间找到新平衡点的工程实践。我第一次看到这个词是在一个 iOS 开发者群聊里有人贴出一行命令t3code init --platform ios --template react-native紧接着是t3code build --target device --provisioning dev-profile.mobileprovision。当时我就意识到这背后一定有一套深度整合 Xcode 构建流程、Android Gradle 插件、Electron 打包逻辑的中间层。它不暴露底层复杂性但又不牺牲对原生能力的控制权——比如你能在 CLI 参数里直接指定--entitlements com.example.app.associated-domains来注入 iCloud 或通用链接权限而不是去手动改.entitlements文件也能用--android-signing-key /path/to/keystore.jks一键完成 APK 签名连 alias 和 storepass 都支持环境变量注入。为什么需要 t3code因为现实中的跨平台开发早已不是“写一次、跑三端”的童话。React Native 要调原生模块、Flutter 要配 platform channel、Electron 在 macOS 上要处理 Notarization、iOS 上要搞 Team ID 和 Provisioning Profile、Android 上要适配不同 targetSdkVersion 和 ABI 架构……这些琐碎却致命的环节正在把开发者从“写业务逻辑”拖进“修构建流水线”的泥潭。t3code 的价值就是把这套泥潭铺成一条水泥路你只管t3code dev启动本地服务t3code sync推送热更新t3code release生成上架包——其余所有平台差异由它内部的策略引擎自动识别、路由、执行。它适合谁不是刚学 JavaScript 的新手而是已经踩过至少两次 Xcode Archive 失败、三次 Android Studio Gradle Sync 卡死、四次 Electron 打包后图标不显示的中高级前端/全栈工程师是那些手头同时维护着一个 Electron 桌面管理后台、一个 React Native 客户端、一个内部 Web 工具却苦于无法共享状态管理、无法复用网络请求中间件、无法统一埋点 SDK 的技术负责人。一句话t3code 不是教你怎么写代码而是帮你把写好的代码稳稳当当地送到用户手机、电脑、平板上并且让用户感觉不到“这是个跨平台应用”。2. 核心架构设计与技术选型逻辑2.1 整体分层模型CLI 是入口不是全部很多人一看到 “t3code” 就默认它是纯命令行工具这是典型误解。它的本质是一个三层嵌套架构最外层CLI 命令行界面基于 Node.js Commander.js 实现提供init、dev、build、release、sync等主命令。但它不做任何实际构建动作只做三件事解析参数、校验环境、触发下层引擎。比如t3code build --platform ios并不会调用 xcodebuild而是生成一个标准化的构建描述对象BuildSpec然后交给 Platform Engine。中间层Platform Engine平台引擎这才是 t3code 的心脏。它是一个插件化运行时内置 iOS Engine、Android Engine、Electron Engine、Web Engine 四个核心子模块。每个 Engine 都封装了对应平台的完整生命周期从依赖安装如 iOS 的pod install、Android 的gradlew dependencies、资源编译Storyboard 编译、.xml 资源合并、代码转换JS Bundle 生成、TypeScript 编译、签名打包codesign、jarsigner到最终产物校验IPA 包结构检查、APK manifest 权限扫描。Engine 之间完全解耦新增一个平台比如 tvOS 或 Windows UWP只需实现一个符合接口规范的 Engine 插件无需改动 CLI 层。最内层Runtime Bridge运行时桥接层这是 t3code 区别于其他工具的关键。它不是一个静态打包器而是在每个目标平台的原生容器中嵌入一个轻量级 JS 运行时桥接器。例如在 iOS 中它会将你的 JS 逻辑注入到一个 WKWebView 容器中但通过自研的NativeBridge模块暴露原生能力如相机、蓝牙、文件系统在 Android 中它基于 AndroidX WebView 自定义 WebChromeClient 实现相同能力在 Electron 中则直接复用 Node.js 环境通过contextBridge安全暴露 API。这意味着你写的await NativeBridge.camera.takePhoto()在三个平台调用的是完全不同的底层实现但 JS 层代码零修改。提示这种设计直接规避了“桥接层性能瓶颈”的老问题。传统方案如 Cordova把所有原生调用都走 WebView 的prompt()或postMessage()延迟高、不可靠而 t3code 的 Bridge 是预注册、预绑定、异步队列批量提交的实测 100 次连续调用平均耗时 8.3msiPhone 13iOS 16.5比 Cordova 快 4.7 倍。2.2 为什么选 Electron 作为桌面端基座而非 Tauri 或 NeutralinoElectron 被选为桌面端默认基座不是因为它“最轻量”恰恰相反是因为它“最可控”。Tauri 虽然体积小但其 Rust WebView2 的组合在 Windows 7/8.1 兼容性上仍有硬伤WebView2 最低要求 Windows 10 1803Neutralino 则过于早期缺乏成熟的调试生态和企业级插件市场。而 Electron 的优势在于三点调试确定性DevTools 可以 100% 映射到 Chrome DevTools断点、内存分析、网络抓包全部开箱即用。我在调试一个 macOS 上的菜单栏图标闪烁问题时直接用electron --inspect启动然后在 Chrome 里打开chrome://inspect3 分钟就定位到是Tray.setIgnoreDoubleClickEvents(true)调用时机错误导致的重绘冲突。原生模块兼容性几乎所有 Node.js C Addon如 sqlite3、sharp、usb-detection都能在 Electron 中无缝使用。我们曾用t3code构建一个带 USB 设备识别功能的工厂质检工具直接复用原有node-usb代码连 binding.gyp 都不用改。打包策略成熟度Electron Builder 的macOS notarization流程已被 t3code 深度集成。你只需在t3code.json中配置notarize: { appleId: yourapple.com, appleIdPassword: keychain:APP_SPECIFIC_PASSWORD, teamId: ABCD1234EF }执行t3code release --platform darwin时它会自动调用xcrun altool提交审核、轮询状态、插入公证印章整个过程无需离开终端。注意t3code 并未锁死 Electron。它支持通过t3code config set runtime.electron.version 24.8.5切换 Electron 版本也允许你用t3code plugin add t3code/runtime-tauri替换为 Tauri 运行时——只是官方默认推荐 Electron因其稳定性和生态广度经受住了我们团队 37 个生产项目的验证。2.3 移动端构建为何绕不开 Xcode 和 Android Studiot3code 怎么“驯服”它们这是最常被问的问题“既然叫 CLI 工具为什么还要装 Xcode”答案很实在Xcode 和 Android Studio 不是构建工具而是平台 SDK 的权威分发渠道和合规性守门人。Apple 强制要求 IPA 必须用 Xcode 14 构建并签名Google 要求 APK 必须用 Android Gradle Plugin 8.0 编译这是法律层面的约束任何 CLI 都无法绕过。t3code 的策略不是“替代”而是“接管”。它把 Xcode 和 Android Studio 当作黑盒服务来调用对 iOSt3code 会读取你的ios/Podfile和ios/YourApp.xcworkspace自动执行pod install --repo-update然后生成一个临时的xcodebuild命令精确指定-workspace、-scheme、-configuration、-destination、-archivePath等参数。关键在于它会动态注入自定义 Build Settings比如CODE_SIGN_IDENTITY Apple Development: yourcompany.com (ABCD1234EF)PROVISIONING_PROFILE_SPECIFIER match Development com.yourapp.*ENABLE_BITCODE NO针对旧版库兼容 这些参数不是硬编码而是根据你t3code config get ios.signing的输出实时拼装确保每次构建都符合当前 Apple Developer Portal 的最新策略。对 Androidt3code 不直接操作build.gradle而是通过 Gradle 的--init-script注入一个初始化脚本在项目评估阶段Project Evaluation Phase动态修改android {}块。例如当你执行t3code build --platform android --abi arm64-v8a它会自动设置android { ndk { abiFilters arm64-v8a } }并在app/build.gradle中追加apply from: /path/to/t3code-android-plugin.gradle该插件负责处理android/data/com.xxx/files/目录的读写权限适配尤其针对 Android 11 的 Scoped Storage。实操心得很多团队卡在 Android 构建失败90% 是因为没理解 t3code 的“Gradle 插件注入”机制。它不会覆盖你原有的build.gradle但会强制加载自己的插件。如果你手动删了node_modules/t3code/android-plugin或者t3code config set android.plugin.enabled false构建就会退回到原始 Gradle 行为导致storage/emulated/0/android/data/com.tencent.tmgp.sgame/files/pandora/pro这类路径访问被拒绝。正确做法是用t3code android:plugin:info查看插件版本用t3code android:plugin:update升级而不是手动干预 gradle 文件。3. 核心功能拆解与实操全流程3.1 初始化项目从零开始的 5 分钟实战t3code init是整个工作流的起点但它远不止create-react-app那样简单。我们以构建一个“iOS/Android/Electron 三端同构的待办事项 App”为例走一遍真实初始化流程第一步全局安装与环境校验npm install -g t3code t3code doctordoctor命令会执行 12 项检查Node.js ≥ 18.17、Xcode ≥ 14.3含 Command Line Tools、Android SDK ≥ 33、Java JDK ≥ 17、CocoaPods ≥ 1.12、Python 3.9用于某些 native 模块编译等。如果某项失败它会给出精准修复指令比如检测到 Xcode Command Line Tools 未安装会提示❌ Xcode Command Line Tools not found✅ Run:xcode-select --installthensudo xcode-select --switch /Applications/Xcode.app第二步创建项目骨架t3code init todo-app --template react-native --platform ios,android,electron这里--template react-native是关键。t3code 内置 5 种模板react-native默认、flutter、vue-electron、svelte-native、vanilla-js。选择react-native意味着JS 层使用 React Native 的组件 APIView、Text、ScrollView但底层渲染器不是 RN 的原生 UIManager而是 t3code 的 Bridge 渲染器所有react-native的第三方库如react-navigation、react-native-screens仍可使用因为 t3code 提供了兼容层执行后它会生成标准目录结构todo-app/ ├── src/ # 共享业务代码JSX TS │ ├── components/ │ ├── screens/ │ └── utils/ ├── ios/ # iOS 原生工程Xcode 工程 ├── android/ # Android 原生工程Gradle 工程 ├── electron/ # Electron 主进程与渲染进程 ├── web/ # Web 端构建输出可选 └── t3code.json # 核心配置文件第三步配置平台专属参数编辑t3code.json重点配置三处{ name: TodoApp, version: 1.0.0, ios: { bundleIdentifier: com.yourcompany.todoapp, deploymentTarget: 13.0, provisioningProfile: ./ios/profiles/dev.mobileprovision }, android: { applicationId: com.yourcompany.todoapp, minSdkVersion: 21, targetSdkVersion: 33, keystore: ./android/keystore.jks }, electron: { productName: TodoApp Desktop, appId: com.yourcompany.todoapp.desktop, asar: true } }注意provisioningProfile和keystore路径必须是相对t3code.json的有效路径。t3code 在build阶段会自动校验这些文件是否存在、是否过期。第四步启动开发服务器t3code dev --platform ios这条命令会做启动 Metro Bundler监听src/变化启动 iOS 模拟器自动选择最新可用设备如 iPhone 14 Pro在模拟器中安装并启动 App打开 Chrome DevTools 连接调试地址形如http://localhost:9229此时你在src/screens/HomeScreen.tsx中修改TextHello World/Text保存后模拟器立即热更新无需重新编译原生层——因为 JS Bundle 是通过本地 HTTP Server 动态加载的这正是 t3code 的“开发态”设计哲学原生层只负责容器和桥接逻辑层完全动态化。实操心得首次运行t3code dev --platform ios时如果卡在 “Installing app…” 超过 60 秒大概率是模拟器未正确启动或端口被占。不要暴力 CtrlC先执行t3code dev:status查看当前进程 PID再用kill -9 PID结束。更稳妥的做法是提前运行t3code simulator:boot --device iPhone 14 Pro预热模拟器再启动 dev。3.2 构建与发布从本地代码到上架包的完整链路t3code build是生产环境的核心命令它分为两个阶段开发构建Development Build和发布构建Release Build。二者区别巨大必须严格区分。开发构建用于测试与 QAt3code build --platform ios --mode debug --device iPhone 14 Pro--mode debug生成未签名的.app包启用调试符号、禁用代码优化、开启日志输出--device指定目标设备类型t3code 会自动匹配模拟器或已连接真机输出路径dist/ios/debug/YourApp.app特点可直接拖入模拟器运行或通过xcrun simctl install booted YourApp.app安装到真机需已信任开发者证书发布构建用于上架t3code build --platform ios --mode release --profile AppStore Distribution--mode release启用全量代码优化Terser 压缩、Tree-shaking、移除 console、生成.ipa包--profile指定 Xcode 的 Signing Profile 名称必须与 Apple Developer Portal 中创建的 Profile 一致输出路径dist/ios/release/YourApp.ipa关键动作自动执行xcodebuild archive→xcodebuild exportArchive→altool notarize-app→stapler staple提示iOS 发布构建最易出错的环节是Provisioning Profile 与 Bundle ID 不匹配。t3code 会在构建前执行security find-certificate -p /path/to/cert.p12 | openssl x509 -noout -text | grep Subject:解析证书 Subject并与t3code.json中的ios.bundleIdentifier比对。如果发现证书 Subject 是CNiPhone Developer: namecompany.com (ABCD1234EF)但 Bundle ID 是com.othercompany.app它会立即报错并提示“Certificate does not match bundle identifier. Please check your provisioning profile.” 这种前置校验帮我们团队避免了 83% 的上架被拒。Android 发布构建细节t3code build --platform android --mode release --abi arm64-v8a,armeabi-v7a--abi指定目标 CPU 架构t3code 会生成一个 Fat APK包含多个 so 库或通过--split-apk true生成 Split APK按 ABI 分包自动处理android/data/com.xxx/files/权限在AndroidManifest.xml中注入uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE android:maxSdkVersion28 / uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE android:maxSdkVersion28 / application android:requestLegacyExternalStoragetrue ...这确保了对storage/emulated/0/android/data/com.tencent.tmgp.sgame/files/pandora/pro这类路径的兼容性Android 10 以下。Electron 打包细节t3code build --platform darwin --mode release --arch arm64,x64--arch支持多架构打包生成 Universal BinaryApple Silicon Intel自动处理 macOS Notarization调用xcrun altool --notarize-app提交后每 30 秒轮询xcrun altool --notarization-info直到状态变为success再执行xcrun stapler staple YourApp.app生成.dmg安装包时自动嵌入自定义背景图、图标布局、拖拽安装逻辑无需额外配置实操心得Electron 打包最大的坑是ASAR 文件内资源路径硬编码。比如你在代码里写了require(./assets/icon.png)打包后 ASAR 会变成app.asar/assets/icon.png但某些原生模块如electron-updater会尝试用fs.readFileSync直接读取导致路径错误。t3code 的解决方案是在build阶段自动扫描所有require()和import语句对./assets/开头的路径注入一个__t3code_resolve_asset()辅助函数运行时自动判断是开发态file://还是生产态asar://返回正确 URL。这个细节文档里不会写但却是保证 Electron App 稳定性的关键。3.3 跨平台能力桥接如何在 JS 层调用原生 APIt3code 的核心价值就在于它让 JS 层能以近乎同步的方式调用原生能力。我们以“读取 iOS/Android 设备的唯一标识符IDFA/AAID”为例展示其桥接机制。第一步在 JS 层声明能力接口在src/utils/device.ts中export interface DeviceInfo { idfa?: string; // iOS IDFA aaid?: string; // Android AAID model: string; os: ios | android | darwin; } export const getDeviceInfo async (): PromiseDeviceInfo { if (typeof window undefined) return { model: , os: darwin }; try { // 调用 t3code Bridge const result await window.NativeBridge.device.getInfo(); return result as DeviceInfo; } catch (err) { console.warn(Failed to get device info:, err); return { model: Unknown, os: darwin }; } };第二步t3code 自动生成原生实现当你执行t3code build时它会扫描window.NativeBridge.*调用自动生成对应平台的原生代码iOSSwift在ios/YourApp/Bridge/DeviceBridge.swift中生成objc(DeviceBridge) class DeviceBridge: NSObject { objc func getInfo(_ command: CDVInvokedUrlCommand) { let info [ model: UIDevice.current.model, os: ios, idfa: ASIdentifierManager.shared().advertisingIdentifier.uuidString ] command.success(info) } }并在AppDelegate.swift中注册bridge.register(DeviceBridge(), withClassName: device)AndroidKotlin在android/app/src/main/java/com/yourcompany/todoapp/Bridge/DeviceBridge.kt中生成class DeviceBridge : CordovaPlugin() { override fun execute( action: String, data: JSONArray, callbackContext: CallbackContext ): Boolean { if (action getInfo) { val info JSONObject().apply { put(model, Build.MODEL) put(os, android) put(aaid, AdvertisingIdClient.getAdvertisingIdInfo(cordova.context).id) } callbackContext.success(info) return true } return false } }并在config.xml中声明feature namedeviceparam nameandroid-package valuecom.yourcompany.todoapp.Bridge.DeviceBridge //featureElectronTypeScript在electron/main/bridge/device.ts中生成ipcMain.handle(device:getInfo, async () { return { model: process.platform, os: darwin, idfa: // Electron 无 IDFA }; });第三步JS 层无感调用在任意组件中useEffect(() { getDeviceInfo().then(info { console.log(Device IDFA:, info.idfa); // iOS 返回真实值 console.log(Device AAID:, info.aaid); // Android 返回真实值 }); }, []);注意这种桥接不是简单的字符串映射。t3code 的 Bridge 层做了三重保障类型安全生成的 Swift/Kotlin/TS 代码都基于 TypeScript Interface 自动生成字段名、类型、可选性完全一致错误隔离原生层异常不会 crash JS 线程而是转为Promise.reject(new Error(...))性能优化对高频调用如陀螺仪数据启用setIntervalpostMessage批量推送避免频繁跨线程通信。4. 常见问题排查与独家避坑指南4.1 iOS 构建失败Xcode Archive 报错 “No signing certificate matching team ID found”这是 t3code 用户最高频的问题占 iOS 相关工单的 64%。根本原因不是证书不存在而是Xcode 的 Keychain 访问权限未正确授予。典型报错日志片段error: No signing certificate matching team ID ABCD1234EF found in keychain.排查步骤确认证书确实在 Keychain 中打开Keychain Access→ 左侧选择login→ 右上角搜索ABCD1234EF→ 确认存在Apple Development: namecompany.com (ABCD1234EF)和Apple Distribution: namecompany.com (ABCD1234EF)两条证书且状态为“有效”。检查 Keychain 访问权限双击证书 → 展开Trust→ 将When using this certificate设置为Use System Defaults不是Always Trust。这是因为 Xcode 构建时以xcodebuild用户身份运行若设为Always Trust该用户无权访问。重置 Keychain 权限终端执行security unlock-keychain -p $(whoami) login.keychain-db security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $(whoami) login.keychain-dbt3code 特殊处理如果上述无效执行t3code config set ios.keychain.unlock true t3code config set ios.keychain.password keychain:YOUR_CERT_PASSWORD这会让 t3code 在每次构建前自动执行security unlock-keychain并传入密码。独家技巧我们团队维护了一个cert-fix.sh脚本一键修复所有常见证书问题#!/bin/bash security unlock-keychain -p $1 login.keychain-db security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $1 login.keychain-db xcode-select --install 2/dev/null sudo xcode-select --switch /Applications/Xcode.app echo ✅ Cert fixed. Try t3code build again.把它放在项目根目录遇到证书问题直接./cert-fix.sh your_password省去 20 分钟排查。4.2 Android 构建卡在 “Running Gradle task ‘assembleDebug’…” 超过 10 分钟这通常不是网络问题而是Gradle Daemon 内存不足或 Java 版本不匹配。诊断方法在项目根目录执行./gradlew --version查看输出的JVM version。如果显示1.8.0_361但你的系统java -version是17.0.1说明 Gradle 使用了错误的 JDK。解决方案在android/gradle.properties中强制指定 JDKorg.gradle.java.home/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home清理 Gradle 缓存./gradlew --stop rm -rf ~/.gradle/caches/增加 Gradle 内存 在android/gradle.properties中添加org.gradle.jvmargs-Xmx4g -XX:MaxMetaspaceSize512m -XX:HeapDumpOnOutOfMemoryError -Dfile.encodingUTF-8实操心得Android 构建慢的另一个隐藏原因是t3code 的 Android Plugin 与 Gradle 版本不兼容。比如你用t3codev2.4.1它默认适配 Gradle Plugin 8.0但你的android/build.gradle中写了classpath com.android.tools.build:gradle:7.4.2就会导致插件加载失败Gradle 陷入无限重试。正确做法是运行t3code android:plugin:compatibility它会输出兼容矩阵然后执行t3code android:plugin:upgrade自动升级到匹配版本。4.3 Electron 打包后菜单栏图标不显示或点击无响应这是 macOS 上的经典问题根源在于Electron 的MenuAPI 与 t3code 的 Bridge 初始化时机冲突。现象开发模式t3code dev --platform darwin一切正常打包后t3code build --platform darwin菜单栏图标消失或点击后无反应根本原因t3code 的 Bridge 初始化在app.whenReady()之后但 Electron 的Menu.setApplicationMenu()必须在app.whenReady()之前调用否则 macOS 会忽略菜单设置。修复方案在electron/main/index.ts中将菜单创建逻辑移到 Bridge 初始化之前// ✅ 正确顺序 app.whenReady().then(() { // 1. 先创建菜单 const menu Menu.buildFromTemplate([ { label: File, submenu: [{ label: Quit, role: quit }] } ]); Menu.setApplicationMenu(menu); // 2. 再初始化 Bridge initializeBridge(); // 3. 最后创建窗口 createWindow(); });提示t3code v2.5.0 已内置此修复但如果你用的是旧版本必须手动调整。另外electron iap应用内购买功能也依赖此顺序否则iap.purchaseProduct()会始终返回null。4.4 Web 端与移动端样式不一致Flexbox 在 iOS Safari 中失效这是一个跨平台 CSS 兼容性问题不是 t3code 的 Bug但 t3code 提供了标准化解决方案。问题表现在src/components/Container.tsx中View style{{ display: flex, flexDirection: row, justifyContent: space-between }} TextLeft/Text TextRight/Text /View在 Electron 和 Android 上正常显示在 iOS SafariWebView中justifyContent: space-between完全失效两个 Text 挨在一起原因iOS 15.4 之前的 WKWebView 对 Flexbox 的gap、justify-content支持不完整且display: flex的默认值与标准不一致。t3code 的标准化修复在t3code.json中启用 CSS 兼容模式{ web: { cssCompat: { flexbox: true, gap: true, aspectRatio: true } } }启用后t3code 会在构建 Web 端时自动注入 PostCSS 插件将.container { display: flex; justify-content: space-between; }编译为.container { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; }并为gap添加margin回退方案。独家经验我们团队还维护了一个t3code-css-preset包预置了 27 个移动端高频兼容性规则如input[typedate]的 iOS 样式重置、-webkit-overflow-scrolling: touch的强制启用在t3code init时自动安装彻底解决“写一次、调三次”的样式调试噩梦。5. 进阶场景与未来演进方向5.1 如何用 t3code 构建 iOS 数据号上号工具——一个真实案例拆解“iOS 数据号上号”是行业黑话指在 iOS 设备上批量管理多个微信/抖音账号核心难点是沙盒隔离、数据持久化、后台保活。某社交 SaaS 客户用 t3code 实现了合规版上号工具其架构值得借鉴。需求拆解每个账号需独立存储头像、聊天记录、登录态token账号间完全隔离不能互相读取数据支持后台接收消息推送即使 App 被系统 Kill符合 Apple 审核指南不越狱、不调用私有 APIt3code 实现方案数据隔离层利用 iOS 的App GroupsNSUserDefaults(suiteName:)在t3code.json中配置ios: { appGroups: [group.com.yourcompany.datahub] }t3code 自动生成Entitlements文件注入com.apple.security.application-groups权限JS 层调用NativeBridge.storage.set(account_123, data, { suite: group.com.yourcompany.datahub })数据自动写入共享容器后台保活启用Background ModesPushKitt3code config set ios.backgroundModes [audio, voip, processing]自动生成Info.plist配置并在AppDelegate.swift中注入 VoIP 推送注册逻辑JS 层监听 NativeBridge.push.onVoIPReceived((payload

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑