iOS 上的屏幕截图隐藏 / 显示内容的研究

背景 在现代数字交流中,屏幕截图成为一种常见的工具,不仅用于记录和保存内容,还广泛用于分享信息。一篇题为《Why do people take Screenshots on their Smartphones?》1 的研究论文指出,有97%的受访者曾将截图发送给他人。这一数据表明,屏幕截图不仅仅是个人记录的手段,更是一种重要的社交互动方式。通过截图,用户能够快速分享对话、通知或有用的内容,从而在信息传播和交流中发挥关键作用。 然而,对于这样高比例的分享行为,用户可能的目的有: 认为当前屏幕的内容有趣,想要分享给其他人; 认为当前屏幕的内容不符合预期,想要反馈给开发者; 于是,我们可以从中做出这些事: 在用户截图时将品牌 logo 放置在不影响其他内容的地方,提高品牌宣传力; 将屏幕截图中的敏感信息隐藏起来,防止这些内容暴露给其他人,保护用户隐私; 在隐私协议允许范围内将诊断信息隐藏在截图中,从而更好地优化产品可能遇到的问题; 因此,接下来我们将开始研究实现方式。 使用 mask 隐藏 / 显示信息 本质上来讲,我们如果做到了可以在截屏时隐藏信息,那也就同样做到了显示信息,我们可以通过隐藏 / 显示蒙板的内容来控制实际内容的显示。对于 SwiftUI,有以下代码: content .mask { ZStack { Color.white HideWhenTakingScreenshot { Color.black } } .compositingGroup() .luminanceToAlpha() } 假设我们已经实现了 HideWhenTakingScreenshot 中的内容,在屏幕截图时隐藏 Color.black ,对于 content ,也就相当于在屏幕截图时显示了,UIKit 同理。 在屏幕截图时隐藏信息 经过层层过滤,其实我们的真实需求是如何在屏幕截图时隐藏信息。 UITextField 的神奇作用 说到隐私保护,我们不得不想起当用户在密码框中输入密码时作为 iOS 系统级的保护,他会在用户截屏时自动隐藏密码输入框,如以下代码所示: struct PasswordTextView: UIViewRepresentable { @Binding var password: String? func makeUIView(context: Context) -> UITextField { let textField = UITextField() textField....

July 16, 2024 · 6 min · Sidney Liu

初识 React Native

安装 由于开发需要,稍稍玩了玩 React Native 开发一个 App 的简要流程。 官网 安装使用时,可以使用 Expo ,可以省去在 Xcode 或者 Android Studio 配置的过程。 运行以下命令安装 Expo npm install -g expo-cli 注意这里在 npm 前不要加 sudo,请提前确保权限通顺 sudo chown -R $(whoami) ~/.npm sudo chown -R $(whoami) /usr/local/lib/node_modules 安装好后,我试图运行 Expo,但是得到了 Expo 不支持当前的 Node 版本的错误,于是运行 nvm 来安装最新版本 Node(以下是未安装 nvm 的版本): sudo npm install -g n sudo n latest 或者,使用 yarn yarn global add expo-cli 开始 安装好后,生成第一个项目: expo init rn_proj 进入目录并运行 cd rn_proj expo start 然后同时会打开一个 Web 控制台...

March 1, 2021 · 1 min · Sidney Liu