…rd/onActivityResult)
本提交是用户驱动的一波集成简化,把消费者侧需要做的 native 配置项从
~40 降到 ~12 (主要降在 Android 端),同时把 PIPL 流程从一步 init
拆成友盟官方推荐的 preInit + init 两步。
═══════════════════════════════════════════════════════════
A. JS 传配置 + preInit/init 两步 (B 路径)
───────────────────────────────────────────────────────────
API 变化 (breaking):
await Common.preInit(config) // App 启动后立刻调,可在 user 同意前
await Common.init() // user 同意后调,真正开始上报
config 字段: appkey (必填), channel, wechatAppId, wechatAppSecret,
wechatUniversalLink, dingtalkAppId
PIPL 合规姿态:
- preInit: 缓存 config + 注册微信/钉钉平台 (setPlaform / setWeixin),
Android 还跑 UMConfigure.preInit (友盟 SDK 占位,无上报)
- init: 真正调 UMConfigure.initWithAppkey (iOS) / UMConfigure.init
(Android) 开始上报
iOS 兼容: 友盟公开 SDK 没 preInit API。我们 preInit 阶段跑 setPlaform
+ 缓存 config (无 SDK 副作用),initWithAppkey 推迟到 init 跑。跟 Android
preInit + init 在 PIPL 合规上等价。
变更文件:
- src/NativeUmengCommon.ts: spec 加 preInit(config: Object), init()
- src/types.ts: 加 UmengInitConfig
- src/common.ts: 改 preInit/init 两个方法 + UmengError 校验
- src/__tests__/common.test.ts: 8 cases preInit + init 全覆盖
- src/index.ts: export UmengInitConfig
- ios/UmengBootstrap.{h,mm}: ensurePreInit:config:error: +
ensureInit:error:,内部用 _appkey/_channel 缓存
- ios/UmengCommon.mm: 实现 preInit / init 两个 turbo 方法
- android/.../UmengBootstrap.kt: ensurePreInit(ctx, config) +
ensureInit(ctx),内部 @volatile 缓存 appkey/channel
- android/.../UmengCommonModule.kt: 改 preInit / init 两个方法
- android/.../UmengAnalyticsModule.kt / UmengShareModule.kt:
删 init { ensurePreInit }(PIPL: Module 构造期不调任何友盟 API)
- example/src/App.tsx: 拆 2 个按钮分别调 preInit / init
═══════════════════════════════════════════════════════════
B. consumer-rules.pro 自动合并 proguard 规则
───────────────────────────────────────────────────────────
新建 android/consumer-rules.pro: 18 行 -keep 规则,覆盖友盟 / 微信 /
钉钉 SDK 反射查类 + R 资源 + (JSONObject) 反序列化 + enum
values/valueOf。
android/build.gradle 加 consumerProguardFiles 'consumer-rules.pro'。
跟 aar 一起发布,宿主 R8 (minifyEnabled true) 时 AGP 自动合并。
消费者不开 R8 时 zero-cost (规则被 ignore);开 R8 时自动保护。
═══════════════════════════════════════════════════════════
C. AndroidManifest 自动合并 permissions/queries
───────────────────────────────────────────────────────────
android/src/main/AndroidManifest.xml 加:
- uses-permission × 3 (INTERNET / NETWORK_STATE / WIFI_STATE)
- queries × 2 (com.tencent.mm / com.alibaba.android.rimet)
Android manifest merger 自动合并到宿主 Manifest,消费者不用复制。
═══════════════════════════════════════════════════════════
D. UmengShareModule 用 ActivityEventListener 自接管 onActivityResult
───────────────────────────────────────────────────────────
UmengShareModule.kt 实现 com.facebook.react.bridge.ActivityEventListener,
init 时 reactContext.addActivityEventListener(this),onActivityResult
里转发给 UMShareAPI.get(activity).onActivityResult(...)。invalidate()
钩子里 removeActivityEventListener + UMShareAPI.release()。
消费者 MainActivity 不用 override onActivityResult / onDestroy 转发。
═══════════════════════════════════════════════════════════
README 全面更新
───────────────────────────────────────────────────────────
- JS API 示例改 preInit + init 两步
- iOS Info.plist: 删友盟相关 key,仅留 iOS 系统强制的
LSApplicationQueriesSchemes + CFBundleURLTypes
- Android Manifest: 删 uses-permission/queries/meta-data,仅留
微信/钉钉两个回调 Activity 注册 (SDK 硬限制必须在宿主包名下)
- 删 Proguard 章节,加一段说明 "consumer-rules.pro 自动合并"
- 删 MainActivity override 章节,加一段说明 "ActivityEventListener
自接管"
- DDShareActivity 示例改成硬编码 appid (manifest meta-data 删了之后
Activity 无法读;钉钉 SDK 7.3.7 限制 Activity 必须在 onCreate
传 appId)
═══════════════════════════════════════════════════════════
验证
───────────────────────────────────────────────────────────
yarn typecheck: OK
yarn test: 41/41 (新加 5 cases preInit + init 拆分)
pod install: OK
yarn build:ios: OK (本地 Xcode 26.5 + prebuilt RNCore,
ReactNativeUmengExample.app 生成,
零 'memory file not found' / 'Unable
to find module' 错误)
═══════════════════════════════════════════════════════════
消费者集成项数对比
───────────────────────────────────────────────────────────
Before After
iOS Info.plist 友盟相关 key 10 0
iOS Info.plist URL scheme 4 4 (iOS 系统强制)
iOS AppDelegate 改动 8 行 8 行 (没法 swizzle)
Android Manifest meta-data 5 0
Android Manifest permission 3 0 (自动合并)
Android Manifest queries 2 0 (自动合并)
Android Manifest activity 2 2 (微信/钉钉 SDK 硬限制)
Android MainActivity override 2 method 0
Android Proguard 18 行规则 18 行 0
JS API 1 调 2 调 (preInit + init)
合计 ~40 ~12
User description
变更概述
类型
feat新功能(会触发 minor 发版)fixBug 修复(会触发 patch 发版)refactor/chore/docs/test/ci(不发版)BREAKING CHANGE: ...)验证
yarn lintyarn typecheckyarn testexample/跑过微信/钉钉分享、PIPLCommon.init()流程yarn turbo run build:android/build:ios通过影响范围 / 注意点
PR Type
Enhancement, Documentation
Description
将友盟初始化从 Info.plist/AndroidManifest 配置改为 JS 传 config + preInit/init 两步
自动合并 Android 权限/Proguard 规则,减少宿主集成配置项
自动接管 onActivityResult 回调,简化宿主 MainActivity
更新 README 文档,修正 Swift 调用 ObjC 示例
Diagram Walkthrough
File Walkthrough
11 files
添加 preInit 示例按钮添加 preInit 接口定义实现 preInit 函数导出 UmengInitConfig 类型定义 UmengInitConfig 接口移除 Module 构造期 preInit改为两步初始化 + JS 传配置实现 preInit 桥接方法自动接管 onActivityResult改为两步初始化 + JS 传配置实现 preInit 桥接方法1 files
添加 preInit 单元测试2 files
更新文档:JS 传配置 + 简化集成步骤更新头文件注释和接口2 files
添加自动合并的 Proguard 规则声明权限和包可见性