隐私合规(PIPL)
本库的初始化采用 preInit → init 两段式,满足 PIPL(个人信息保护法)对「用户同意前不采集」的要求。本页讲清两段的职责、时序与两个易错点。
两段式设计
| 阶段 | 调用时机 | 行为 |
|---|---|---|
Common.preInit(config) | App 启动后立刻,可在用户同意之前 | 存 config + 注册微信 / 钉钉平台,不上报任何数据 |
Common.init() | 用户点「同意《隐私协议》」之后 | 正式启动友盟数据采集 |
import { Common } from '@unif/react-native-umeng';
// 1) App 启动:preInit —— 不上报,所有 config 都在这里给
await Common.preInit({
appkey: 'YOUR_UMENG_APPKEY',
wechatAppId: 'wxXXXX',
wechatAppSecret: 'XXXX',
wechatUniversalLink: 'https://your.host/', // 微信 1.8.6+(iOS)要求
dingtalkAppId: 'dingoaXXXX',
});
// 2) 用户同意《隐私协议》之后:开始采集
await Common.init(); // ⚠️ 无参 —— config 已给 preInit
两个方法都是 idempotent(幂等),重复调只触发一次,可放心多次调用。
init 必须在用户同意之后
Common.init() 必须在用户明确同意《隐私协议》之后才能调用。隐私弹窗弹出前、或用户拒绝时,不可调 init()。违反将导致合规风险。
推荐接入时序
App 启动
└─▶ Common.preInit(config) // 立刻调,注册微信/钉钉,不采集
用户进入隐私协议弹窗
└─▶ 用户点「同意」
└─▶ Common.init() // 仅此刻调,开始采集
iOS / Android 差异
- Android —— Native 侧在
preInit时调友盟官方UMConfigure.preInit(context, appkey, channel)并注册微信 / 钉钉平台,行为与 JSCommon.preInit()一致 —— 不上报;init时才调UMConfigure.init启动采集。 - iOS —— 友盟 iOS SDK 没有 preInit 接口。
preInit只把 config 存进 native 状态并跑平台配置,真正的UMConfigure.initWithAppkey推迟到init()才执行。因此Common.init()调用之前,桥不会调任何会上报的友盟 iOS API。
无论哪个平台,只要保证 init() 在用户同意后调,即满足合规要求。
易错点(Incorrect / Correct)
1. init 带参
配置只给 preInit,init() 无参:
// ❌ Incorrect:init 不接收 config
await Common.init({ appkey: '...' });
// ✅ Correct:config 给 preInit,init 无参
await Common.preInit({ appkey: '...', /* ... */ });
await Common.init();
2. 没先 preInit 就 init(或 init 早于同意)
init 前必须先 preInit,否则会 reject(E_INVALID_OPTIONS):
// ❌ Incorrect:没 preInit 直接 init —— reject;或在用户同意前就 init —— 违规
await Common.init();
// ✅ Correct:启动 preInit;用户同意后才 init
await Common.preInit({ appkey: '...' }); // App 启动
// …… 展示隐私弹窗,用户点「同意」……
await Common.init(); // 同意后
相关
- 快速上手 —— preInit / init 在启动流程中的位置
- Common API —— preInit / init / isInited 完整参数