vivo隐私合规:Flutter存在频繁收集剪切板信息的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

尊敬的开发者,您好:

平台在日常巡检中核实到贵司应用存在以下问题,请尽快进行更包整改。



应用信息:***, ******

问题详情:自动化隐私测试不通过--不通过 隐私检测报告:https://swsdl.vivo.com.cn/appstore/cloudtest/pdf/***.pdf, 隐私行为数据:https://swsdl.vivo.com.cn/appstore/cloudtest/xlsx/***.xlsx



请于2026年01月18日之前整改,如未重新传包整改,平台将会对您的应用进行处理,包括但不限于下架。

如有疑问可参考《APP常见隐私问题合规指引》及《自动化测试服务介绍》



如有疑问,请联系平台客服咨询。

1. 问题描述

在vivo应用市场的自动化隐私检测中,APP被检测出“SDK存在超频次收集”的问题。具体表现为:

APP在运行时,SDK存在以下违规行为:
1、未向用户告知且未经用户同意,flutter存在频繁采集“剪切板信息”的行为,非服务所必须且无合理应用场景,超出实现产品或服务的业务功能所必须的最低频率。

2. 问题原因

  1. TextField 尝试显示工具栏(长按菜单)或处理选择状态时,它使用的默认 MaterialTextSelectionControls 会调用 canPaste 方法。
  2. 默认的 canPaste 方法内部会调用 Clipboard.getData(Clipboard.kTextPlain) 来检查系统剪切板中是否有文本内容。
  3. 这样做是为了决定是否在菜单中显示“粘贴”按钮(如果剪切板为空,按钮可能会隐藏或禁用)。
  4. 关键点:这种自动检查行为在某些厂商(如vivo)的严格隐私检测中,会被判定为“在用户未主动操作粘贴的情况下,APP自动读取了剪切板”,从而属于违规的频繁/无感收集行为。

3. 解决方案

通过自定义 TextSelectionControls 并重写 canPaste 方法来规避此问题。

我们将 canPaste 修改为直接返回 true(总是认为可以粘贴),从而跳过 Clipboard.getData 的调用。

效果:

  • 修改前:点击输入框 -> 读取剪切板 -> 显示菜单(含粘贴)。(触发隐私检测报警)
  • 修改后:点击输入框 -> 直接显示菜单(含粘贴) -> 用户点击“粘贴” -> 读取剪切板。(合规,属用户主动触发)

3.1 实施步骤

第一步:新增工具类 PrivacyTextSelectionControls

在项目中创建一个新的工具类文件,例如 lib/utils/privacy_text_selection_controls.dart

1
2
3
4
5
6
7
8
9
10
11
12
import 'package:flutter/material.dart';

class PrivacyTextSelectionControls extends MaterialTextSelectionControls {
// 覆盖canPaste方法,直接返回true,避免访问剪切板
// 这样可以避免在未进行粘贴操作时读取剪切板内容,解决隐私合规问题
@override
bool canPaste(TextSelectionDelegate delegate) {
// 直接返回true,表示允许粘贴,但不检查剪切板内容
// 实际粘贴时会在handlePaste中读取剪切板
return true;
}
}

第二步:在 TextField 中应用

找到项目中被检测出问题的输入框页面(如登录页),在 TextField 组件中设置 selectionControls 属性:

1
2
3
4
5
6
7
8
9
10
11
// 1. 引入头文件
import '../../utils/privacy_text_selection_controls.dart';

// ...

// 2. 在 TextField 中使用
TextField(
selectionControls: PrivacyTextSelectionControls(), // 添加这一行
controller: _usernameController,
// 其他属性...
)

参考资料