136 lines
5.1 KiB
Markdown
136 lines
5.1 KiB
Markdown
|
|
# 隐私合规整改说明
|
|||
|
|
|
|||
|
|
## 问题描述
|
|||
|
|
|
|||
|
|
应用在荣耀应用市场上架时被驳回,原因是:
|
|||
|
|
- **高德地图SDK在用户同意隐私政策之前就收集了OAID等信息**
|
|||
|
|
- 违反了隐私合规要求:必须在用户点击同意隐私政策弹窗之后,SDK才能收集相关权限
|
|||
|
|
|
|||
|
|
## 整改方案
|
|||
|
|
|
|||
|
|
### 1. 从Application中移除SDK的提前初始化
|
|||
|
|
|
|||
|
|
**修改文件:** `app/src/main/java/com/xunpaisoft/social/MyApp.java`
|
|||
|
|
|
|||
|
|
**修改内容:**
|
|||
|
|
- 移除了高德定位SDK在`onCreate()`中的初始化(原第122-133行)
|
|||
|
|
- 移除了友盟统计SDK的正式初始化(原第113-117行),只保留预初始化`UMConfigure.preInit()`
|
|||
|
|
|
|||
|
|
**原因:**
|
|||
|
|
- Application的`onCreate()`在应用启动时就会执行,此时用户还没有看到隐私政策弹窗
|
|||
|
|
- 如果此时初始化SDK,SDK可能会立即收集设备信息(如OAID、IMEI等),违反隐私合规要求
|
|||
|
|
|
|||
|
|
### 2. 创建统一的SDK初始化方法
|
|||
|
|
|
|||
|
|
**新增方法:** `MyApp.initThirdPartySDKs(Context context)`
|
|||
|
|
|
|||
|
|
**功能:**
|
|||
|
|
- 统一管理所有第三方SDK的初始化
|
|||
|
|
- 在用户同意隐私政策后统一调用
|
|||
|
|
- 包含高德定位SDK和友盟统计SDK的初始化
|
|||
|
|
|
|||
|
|
**初始化顺序:**
|
|||
|
|
1. 高德定位SDK
|
|||
|
|
- 先调用隐私合规接口:`updatePrivacyShow()` 和 `updatePrivacyAgree()`
|
|||
|
|
- 再初始化定位服务:`AMapLocationHelper.getInstance().init()`
|
|||
|
|
2. 友盟统计SDK
|
|||
|
|
- 调用正式初始化:`initUmengSDKFormally()`
|
|||
|
|
|
|||
|
|
### 3. 在用户同意隐私政策后初始化SDK
|
|||
|
|
|
|||
|
|
**修改文件:** `app/src/main/java/com/xunpaisoft/social/im/main/SplashActivity.java`
|
|||
|
|
|
|||
|
|
**修改内容:**
|
|||
|
|
1. **首次启动场景(用户点击"同意"按钮):**
|
|||
|
|
- 在`tv_dia_ok`的点击事件中,用户点击"同意"后立即调用`MyApp.initThirdPartySDKs()`
|
|||
|
|
- 确保在用户明确同意隐私政策后,SDK才开始收集信息
|
|||
|
|
|
|||
|
|
2. **非首次启动场景(用户已同意过):**
|
|||
|
|
- 在`showNextScreen()`方法中,如果`isNotFirst`为true,说明用户已经同意过隐私政策
|
|||
|
|
- 此时也应该初始化SDK,因为用户已经同意过
|
|||
|
|
|
|||
|
|
## 代码修改详情
|
|||
|
|
|
|||
|
|
### MyApp.java
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 修改前:在onCreate()中直接初始化
|
|||
|
|
com.amap.api.location.AMapLocationClient.updatePrivacyShow(this, true, true);
|
|||
|
|
com.amap.api.location.AMapLocationClient.updatePrivacyAgree(this, true);
|
|||
|
|
com.xunpaisoft.social.utils.AMapLocationHelper.getInstance().init(this);
|
|||
|
|
UMConfigure.init(this, "69009244644c9e2c2067d39b", "Channel", ...);
|
|||
|
|
|
|||
|
|
// 修改后:只预初始化友盟,其他SDK延迟到用户同意后
|
|||
|
|
UMConfigure.preInit(this, "69009244644c9e2c2067d39b", "Channel");
|
|||
|
|
// 高德SDK和友盟正式初始化已移至用户同意隐私政策后
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### SplashActivity.java
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 用户点击"同意"按钮后
|
|||
|
|
viewRoot.findViewById(cn.wildfire.chat.kit.R.id.tv_dia_ok).setOnClickListener(view1 -> {
|
|||
|
|
commDialog.dismiss();
|
|||
|
|
SharedPreferencesUtils.putBoolean(Constants.IS_NOT_FIRST_INTO,true);
|
|||
|
|
|
|||
|
|
// 用户点击同意隐私政策后,初始化第三方SDK
|
|||
|
|
com.xunpaisoft.social.MyApp.initThirdPartySDKs(SplashActivity.this);
|
|||
|
|
|
|||
|
|
// ... 后续逻辑
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 非首次启动时
|
|||
|
|
} else {
|
|||
|
|
// 非首次启动,用户已同意过隐私政策,初始化第三方SDK
|
|||
|
|
com.xunpaisoft.social.MyApp.initThirdPartySDKs(SplashActivity.this);
|
|||
|
|
// ... 后续逻辑
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 合规要点
|
|||
|
|
|
|||
|
|
1. ✅ **首次运行APP时,在用户点击同意隐私政策弹窗之后,SDK再收集相关权限**
|
|||
|
|
- 高德定位SDK和友盟统计SDK的初始化都在用户点击"同意"按钮后执行
|
|||
|
|
|
|||
|
|
2. ✅ **集成的第三方SDK建议升级到最新版本**
|
|||
|
|
- 高德定位SDK已调用隐私合规接口:`updatePrivacyShow()` 和 `updatePrivacyAgree()`
|
|||
|
|
- 友盟统计SDK使用预初始化模式,符合合规要求
|
|||
|
|
|
|||
|
|
3. ✅ **在"同意"按钮上加入判定函数,当用户点击"同意"后,SDK再执行调用系统接口的相关函数行为**
|
|||
|
|
- 在`SplashActivity`的"同意"按钮点击事件中,明确调用`initThirdPartySDKs()`
|
|||
|
|
- 确保只有在用户明确同意后,SDK才开始收集信息
|
|||
|
|
|
|||
|
|
## 测试建议
|
|||
|
|
|
|||
|
|
1. **首次安装测试:**
|
|||
|
|
- 卸载应用,重新安装
|
|||
|
|
- 验证隐私政策弹窗是否正常显示
|
|||
|
|
- 点击"同意"后,检查日志确认SDK已初始化
|
|||
|
|
- 使用抓包工具验证SDK是否在同意后才开始收集信息
|
|||
|
|
|
|||
|
|
2. **非首次启动测试:**
|
|||
|
|
- 关闭应用,重新打开
|
|||
|
|
- 验证SDK是否正常初始化(因为用户已同意过)
|
|||
|
|
|
|||
|
|
3. **拒绝隐私政策测试:**
|
|||
|
|
- 点击"不同意"按钮
|
|||
|
|
- 验证应用是否正常退出
|
|||
|
|
- 验证SDK是否未初始化
|
|||
|
|
|
|||
|
|
## 注意事项
|
|||
|
|
|
|||
|
|
1. **其他SDK检查:**
|
|||
|
|
- 阿里云一键登录SDK:已在Application中初始化,但该SDK在用户主动点击登录按钮时才会收集信息,符合要求
|
|||
|
|
- 推送服务:已在Application中初始化,但推送服务通常不涉及敏感信息收集
|
|||
|
|
|
|||
|
|
2. **后续维护:**
|
|||
|
|
- 如果添加新的第三方SDK,必须遵循相同的原则:在用户同意隐私政策后才初始化
|
|||
|
|
- 建议统一使用`MyApp.initThirdPartySDKs()`方法管理所有SDK的初始化
|
|||
|
|
|
|||
|
|
## 参考文档
|
|||
|
|
|
|||
|
|
- 荣耀应用市场隐私合规要求
|
|||
|
|
- 高德定位SDK隐私合规接口文档
|
|||
|
|
- 友盟统计SDK合规初始化文档
|
|||
|
|
|