2.1 在屏幕共享与远程控制启用时保护敏感内容

原文链接: https://developer.apple.com/documentation/swiftui/protecting-sensitive-content-when-screen-sharing

2.1 在屏幕共享与远程控制启用时保护敏感内容

检测正在进行的屏幕捕获会话,并做出恰当响应,保护应用中的敏感内容。

概述

屏幕共享和远程控制特性为人们提供了有用的协作方式。随着屏幕共享越来越普遍,处理敏感数据的应用——例如银行、支付和医疗类应用——应当采取措施,在正在进行的捕获会话期间保护内容。

iOS 和 iPadOS 提供了内置 API 来检测系统何时捕获某个场景。请响应这一信号,并在应用中主动采取措施,在任何捕获会话期间保护敏感内容。

检测系统何时捕获应用内容

当屏幕捕获会话处于活跃状态时——包括屏幕录制、镜像或远程控制——系统会更新该场景的捕获状态。在 SwiftUI 中使用 isSceneCaptured 环境值,或者在 UIKit 中使用 sceneCaptureState 来观察这个状态。当状态变化时,相应地更新界面——例如把敏感视图替换为屏蔽后的或占位内容。

SwiftUI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
struct AccountView: View {
    @Environment(\.isSceneCaptured) private var isSceneCaptured

    var body: some View {
        if isSceneCaptured {
            // 把 `RedactedContentView` 替换成你屏蔽后的或占位视图。
            RedactedContentView()
        } else {
            // 把 `SensitiveContentView` 替换成你的内容视图。
            SensitiveContentView()
        }
    }
}

UIKit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
override func viewDidLoad() {
    super.viewDidLoad()
    // 注册以观察场景捕获状态的变化。
    registerForTraitChanges([UITraitSceneCaptureState.self]) { (self: Self, previousTraitCollection: UITraitCollection) in
        self.updateContentVisibility()
    }
    // 加载时应用初始状态。
    updateContentVisibility()
}

func updateContentVisibility() {
    let isCaptured = traitCollection.sceneCaptureState != .notCaptured
    // 把 `accountNumberLabel` 和 `balanceLabel` 替换成你想隐藏的敏感界面元素。
    accountNumberLabel.isHidden = isCaptured
    balanceLabel.isHidden = isCaptured
}

注意:sceneCaptureState 并不区分捕获类型。屏幕录制、AirPlay 镜像和远程控制都会产生相同的信号。

响应捕获会话

正确的响应方式取决于应用所处理数据的敏感程度,以及这些内容在捕获会话期间被暴露可能对人们造成的影响。显示财务账户明细或个人健康信息的应用,可能需要比通用应用更强的保护。请评估使用你应用的人所需要的保护级别,从而确定应用检测到捕获会话时应当如何响应:

  • 告知当事人。 显示横幅或应用内通知,让人们知道自己的屏幕正在被共享。
  • 隐藏或屏蔽敏感字段。 把账号、余额、卡片明细和密码替换为占位文本或模糊叠加层。「密码」应用就使用类似模式来保护敏感内容不被截图。
  • 禁用高风险操作。 在捕获处于活跃状态时,阻止转账、显示密码或其他不可逆操作完成。

在保护与可用性之间取得平衡

sceneCaptureState 会因所有捕获事件而激活,包括录制教程或镜像到个人 Apple TV 这类日常用途。决定如何响应时,请考虑以下几点:

  • 有选择地应用保护。 针对应用中风​​险最高的部分,而不是大范围地封锁功能。整体性的应用级锁定可能会让有正当屏幕共享需求的人感到沮丧。
  • 使用中性的措辞。 避免暗示当事人正在遭受攻击的提示。像「屏幕共享已启用。本次会话期间部分内容受保护。」这样平和、信息性的通知,既不容易引起惊慌,也更有效。
  • 为你的受众权衡取舍。 安全要求更严格的银行应用,可能比通用应用更有理由采取限制性更强的行为。请依据应用自身的风险状况来设计响应方式。