📌 前言
随着国内网络安全法规的日益严格,各大应用市场(华为、小米、OPPO、vivo 等)和 iOS App Store 对应用的隐私合规要求越来越高。作为 UniApp 开发者,你是否遇到过以下痛点:
- ❌ 应用上架被拒:隐私协议不完整,漏掉关键 SDK 声明
- ❌ 不知道用了哪些 SDK:项目配置复杂,容易遗漏高风险 SDK
- ❌ 手写隐私协议太难:不知道该写什么、怎么写才符合规范
- ❌ 启动就初始化 SDK:没有在用户同意前拦截 SDK,被审核打回
- ❌ 权限申请被投诉:没有合理说明权限用途,用户不信任
如果你也有这些困扰,那么 lf-auth 隐私合规助手 就是为你量身定制的解决方案!
✨ 产品亮点
🔍 1. 智能静态扫描 - 一键发现所有隐私风险
lf-auth 内置专业的静态扫描引擎,能够自动分析你的项目配置文件,精准识别潜在的隐私合规风险:
- SDK 扫描 :自动识别
manifest.json中配置的 50+常见 SDK(友盟、极光、高德等) - 权限扫描:分析 Android/iOS 权限申请,评估权限风险等级
- 依赖扫描 :检测
package.json中的高风险 NPM 包 - 代码扫描:扫描源代码中的敏感 API 调用(如获取设备信息、位置、通讯录等)
- 风险评分:自动计算隐私合规风险分数(0-100 分),并给出改进建议
核心代码示例:
javascript
import { createScanner } from "@/uni_modules/lf-auth/js_sdk/index.js";
// 读取配置文件
const manifest = require("@/manifest.json");
const packageJson = require("@/package.json");
// 创建扫描器并执行扫描
const scanner = createScanner();
const result = scanner.scan({
manifest,
packageJson,
});
// 查看扫描结果
console.log("风险评分:", result.riskScore); // 如:65分(高风险)
console.log("检测到的SDK:", result.sdks); // 所有SDK列表
console.log("检测到的权限:", result.permissions); // 所有权限列表
console.log("改进建议:", result.suggestions); // 专业的改进建议
扫描结果示例:
javascript
{
riskScore: 65,
sdks: [
{
id: "Statistic",
name: "uni统计",
riskLevel: "high",
dataCollected: ["设备信息", "位置信息", "应用使用情况"],
suggestion: "必须在隐私协议中详细说明数据收集和使用目的"
},
{
id: "Push",
name: "UniPush",
riskLevel: "medium",
dataCollected: ["设备信息", "推送Token"],
suggestion: "需说明推送服务的数据收集范围"
}
],
permissions: [
{
id: "READ_PHONE_STATE",
name: "读取设备信息",
riskLevel: "high",
purpose: "获取设备唯一标识",
description: "用于统计分析和设备识别"
}
],
suggestions: [
{
type: "important",
message: "检测到 2 个高风险SDK,建议使用 lf-auth 拦截组件确保用户同意前不初始化",
riskLevel: "high"
}
]
}
📝 2. 自动生成隐私协议 - 10 秒搞定专业文案
基于扫描结果,lf-auth 能够自动生成符合法律规范的隐私协议 HTML 文档,包括:
- ✅ 隐私政策:完整的隐私保护政策,符合《个人信息保护法》要求
- ✅ 用户协议:标准用户服务协议模板
- ✅ SDK 清单:第三方 SDK 清单,可直接提交到应用市场
- ✅ 多主题支持:浅色/深色主题,适配不同 UI 风格
生成代码示例:
javascript
import { createGenerator } from "@/uni_modules/lf-auth/js_sdk/index.js";
// 创建生成器(填入你的公司信息)
const generator = createGenerator({
companyName: "某某科技有限公司",
appName: "我的应用",
contactEmail: "support@myapp.com",
contactPhone: "xxxxxxx",
companyAddress: "xxx科技园",
theme: "default", // 或 "dark"
includeChildren: true, // 包含未成年人保护条款
});
// 生成隐私政策HTML(基于扫描结果自动填充SDK和权限说明)
const privacyHtml = generator.generate(result);
// 生成用户协议
const agreementHtml = generator.generateUserAgreement();
// 生成SDK清单纯文本(用于应用市场提交表单)
const sdkListText = generator.generateSDKListText(result.sdks);
console.log(sdkListText);
// 输出:
// 第三方SDK清单:
// 1. uni统计 - 用于应用数据统计分析
// 数据收集:设备信息、位置信息、应用使用情况
// 2. UniPush - 用于消息推送服务
// 数据收集:设备信息、推送Token
一键完成扫描+生成:
javascript
import { scanAndGenerate } from "@/uni_modules/lf-auth/js_sdk/index.js";
// 一行代码搞定所有!
const result = scanAndGenerate({
manifest: require("@/manifest.json"),
packageJson: require("@/package.json"),
generatorOptions: {
companyName: "深圳市某某科技有限公司",
appName: "我的应用",
contactEmail: "support@myapp.com",
},
});
// 直接使用生成的结果
const { scanResult, privacyPolicy, userAgreement, sdkList } = result;
🛡️ 3. 启动拦截组件 - 确保合规不翻车
这是 lf-auth 最核心的功能!提供开箱即用的隐私弹窗组件,确保用户首次启动时必须同意隐私政策,在用户同意前绝不初始化任何 SDK。
组件使用示例:
javascript
<template>
<view>
<!-- 隐私拦截弹窗 -->
<lf-privacy-popup
:privacy-url="privacyUrl"
:agreement-url="agreementUrl"
:show-sdk-list="true"
:sdk-list="sdkList"
@agreed="handlePrivacyAgreed"
@disagree="handlePrivacyDisagree"
/>
<!-- 你的应用内容 -->
<view>应用主体内容</view>
</view>
</template>
<script>
export default {
data() {
return {
privacyUrl: "https://yourapp.com/privacy.html",
agreementUrl: "https://yourapp.com/agreement.html",
sdkList: [
{ name: "uni统计", purpose: "数据统计分析" },
{ name: "UniPush", purpose: "消息推送服务" },
],
sdkInitialized: false,
};
},
methods: {
handlePrivacyAgreed() {
console.log("用户已同意隐私政策");
// ⚠️ 重点:只有用户同意后才初始化SDK
if (!this.sdkInitialized) {
this.initAllSDK();
this.sdkInitialized = true;
}
},
handlePrivacyDisagree() {
console.log("用户拒绝隐私政策");
// 退出应用或给予用户提示
uni.showModal({
title: "提示",
content: "需要您同意隐私政策才能使用本应用",
showCancel: false,
});
},
initAllSDK() {
// 在这里初始化所有SDK
// 初始化友盟统计
// this.initUmeng();
// 初始化极光推送
// this.initJPush();
// 初始化高德地图
// this.initAmap();
console.log("所有SDK初始化完成");
},
},
};
</script>
组件核心特性:
| 特性 | 说明 |
|---|---|
| 🎨 美观 UI | 专业的弹窗设计,支持浅色/深色主题 |
| 🔒 强制拦截 | 首次启动必须同意,用户拒绝可退出应用 |
| 📜 协议链接 | 支持跳转到完整的隐私政策和用户协议 |
| 📋 SDK 清单展示 | 可选择展示第三方 SDK 列表,增强透明度 |
| 💾 持久化存储 | 用户同意后永久记录,不会重复弹出 |
| 🌐 全平台支持 | 支持 App、H5、小程序 |
🎯 完整使用流程
Step 1: 安装插件
访问 DCloud 插件市场 - lf-auth 隐私合规助手,点击"使用 HBuilderX 导入插件"。
或手动下载后复制到项目的 uni_modules 目录下。
Step 2: 扫描并生成隐私协议
在项目中创建一个扫描脚本(如 scripts/scan-privacy.js):
javascript
import { scanAndGenerate } from "@/uni_modules/lf-auth/js_sdk/index.js";
import fs from "fs";
const result = scanAndGenerate({
manifest: require("../manifest.json"),
packageJson: require("../package.json"),
generatorOptions: {
companyName: "你的公司名称",
appName: "你的应用名称",
contactEmail: "support@yourcompany.com",
contactPhone: "xxxxxxx",
companyAddress: "公司地址",
},
});
// 保存隐私协议到文件
fs.writeFileSync("./static/privacy.html", result.privacyPolicy);
fs.writeFileSync("./static/agreement.html", result.userAgreement);
fs.writeFileSync("./static/sdk-list.txt", result.sdkList);
console.log("✅ 隐私协议生成成功!");
console.log("风险评分:", result.scanResult.riskScore);
console.log("改进建议:", result.scanResult.suggestions);
Step 3: 集成隐私拦截组件
在 App.vue 中添加隐私拦截组件:
javascript
<template>
<view>
<lf-privacy-popup
privacy-url="/static/privacy.html"
agreement-url="/static/agreement.html"
@agreed="handlePrivacyAgreed"
/>
</view>
</template>
<script>
export default {
onLaunch: function () {
console.log("App Launch");
// ⚠️ 不要在这里初始化SDK,等待用户同意
},
methods: {
handlePrivacyAgreed() {
// 用户同意后才初始化SDK
this.initSDK();
},
initSDK() {
// 初始化各种SDK...
},
},
};
</script>
Step 4: 提交应用市场
- 将生成的
sdk-list.txt内容复制到应用市场的"第三方 SDK 清单"表单 - 上传
privacy.html到你的服务器并在应用信息中填写隐私协议链接 - 提交审核,坐等通过!✅
💡 核心优势
对比手动处理隐私合规:
| 维度 | 手动处理 | 使用 lf-auth |
|---|---|---|
| SDK 识别 | 需逐个查看配置,容易遗漏 | ✅ 自动扫描 50+常见 SDK |
| 隐私协议编写 | 需要法律专业知识,耗时数小时 | ✅ 10 秒自动生成专业协议 |
| 启动拦截 | 需自己开发弹窗组件 | ✅ 开箱即用的拦截组件 |
| SDK 延迟初始化 | 需手动改造代码逻辑 | ✅ 提供标准化接入方案 |
| 应用市场提交 | 需手动整理 SDK 清单 | ✅ 一键生成提交材料 |
| 维护成本 | SDK 变更需重新整理 | ✅ 重新扫描即可更新 |
对比其他隐私合规方案:
- ✅ 专为 UniApp 优化:完美适配 UniApp 项目结构
- ✅ 免费开源:MIT 协议,无任何使用限制
- ✅ 轻量级:核心代码不到 100KB,不影响应用性能
- ✅ 无外部依赖:纯 JavaScript 实现,不依赖任何第三方库
- ✅ 持续更新:SDK 数据库持续维护,紧跟政策变化
📊 技术实现原理
静态扫描引擎
lf-auth 的扫描器通过解析 manifest.json 和 package.json,利用内置的 SDK 风险数据库进行匹配:
javascript
// 部分核心扫描逻辑
class Scanner {
_scanModules(modules) {
Object.keys(modules).forEach((moduleKey) => {
const sdkInfo = SDK_DATABASE[moduleKey];
if (sdkInfo) {
this.result.sdks.push({
id: moduleKey,
...sdkInfo,
source: "modules",
});
}
});
}
_scanAndroidPermissions(appPlus) {
const permissions = appPlus.distribute?.android?.permissions || [];
permissions.forEach((permStr) => {
const permKey = this.parseAndroidPermission(permStr);
if (permKey && PERMISSION_DESCRIPTIONS[permKey]) {
const permInfo = PERMISSION_DESCRIPTIONS[permKey];
this.result.permissions.push({
id: permKey,
...permInfo,
platform: "android",
});
}
});
}
calculateRiskScore() {
let score = 0;
this.sdks.forEach((sdk) => {
switch (sdk.riskLevel) {
case "critical":
score += 25;
break;
case "high":
score += 15;
break;
case "medium":
score += 8;
break;
case "low":
score += 3;
break;
}
});
return Math.min(100, score);
}
}
内置 SDK 数据库
插件内置了 50+常见 SDK 的风险评估数据:
javascript
const SDK_DATABASE = {
Statistic: {
name: "uni统计",
riskLevel: "high",
dataCollected: ["设备信息", "位置信息", "应用使用情况"],
provider: "DCloud",
suggestion: "必须在隐私协议中详细说明数据收集和使用目的",
},
Push: {
name: "UniPush",
riskLevel: "medium",
dataCollected: ["设备信息", "推送Token"],
provider: "DCloud/个推",
suggestion: "需说明推送服务的数据收集范围",
},
// ... 更多SDK数据
};
⚠️ 注意事项与最佳实践
1. 法律合规性声明
⚠️ 重要提示:本插件生成的隐私协议仅供参考,不构成法律建议。正式上线前建议:
- 咨询专业法律人士审核
- 根据实际业务场景调整协议内容
- 确保协议内容与应用实际行为完全一致
2. SDK 延迟初始化最佳实践
javascript
// ❌ 错误做法:App启动就初始化SDK
export default {
onLaunch() {
this.initUmeng(); // 违规!用户还没同意
this.initJPush();
}
}
// ✅ 正确做法:等用户同意后再初始化
export default {
data() {
return { sdkReady: false };
},
methods: {
handlePrivacyAgreed() {
if (!this.sdkReady) {
this.initUmeng();
this.initJPush();
this.sdkReady = true;
}
}
}
}
3. 定期更新隐私协议
建议每次发版前重新扫描:
bash
# 在发版脚本中加入扫描
node scripts/scan-privacy.js
4. 权限申请时机
在用户实际使用相关功能时再申请权限,而不是启动时就申请所有权限:
javascript
// ❌ 不好的做法
onLaunch() {
uni.authorize({ scope: 'scope.userLocation' });
uni.authorize({ scope: 'scope.camera' });
}
// ✅ 推荐做法
onUseMap() {
// 用户点击地图功能时再申请位置权限
uni.authorize({ scope: 'scope.userLocation' });
}
🎉 总结
lf-auth 隐私合规助手 是每个 UniApp 开发者的必备工具!它能帮你:
✅ 10 分钟搞定隐私合规 ,节省数小时的手动整理时间
✅ 一次通过应用市场审核 ,避免反复修改提交
✅ 专业的法律协议文案 ,保护你和用户的合法权益
✅ 规范的 SDK 延迟初始化,符合所有应用市场要求
📥 立即获取
👉 插件地址 :DCloud 插件市场 - lf-auth 隐私合规助手
💬 常见问题 FAQ
Q1:插件是免费的吗?
A:完全免费!MIT 开源协议,可商用。
Q2:支持哪些平台?
A:支持 App(Android/iOS)、H5、微信/支付宝/百度/字节跳动/QQ 小程序。
Q3:生成的隐私协议能直接用吗?
A:建议作为基础模板使用,正式上线前请法律人士审核。
Q4:我已经上架的应用可以用吗?
A:可以!扫描现有配置,更新隐私协议并重新提交审核即可。
Q5:SDK 数据库会更新吗?
A:会持续维护更新,紧跟应用市场最新政策要求。
有任何问题欢迎在评论区留言交流!