iOS 隐私警报

重要

Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但你可以考虑迁移到几个建议的替代方法。

详细了解支持时间线和替代方法。

注意

本文不解决在应用程序中使用 UIAlertViewController 创建的警报。 可以通过适当的测试查询直接处理它们。 本文介绍标准 UI 查询无法处理的 iOS 生成的警报。

执行 iOS 应用程序时,当应用程序尝试激活或访问 Apple 推送通知、位置服务、联系人、设备麦克风或相机等以请求权限时,操作系统可能会在不同时间向用户显示警报。 这些弹出窗口有时称为警报、系统警报、系统弹出窗口、Springboard 警报或隐私对话框。 接受这些请求后,该接受状态将保持不变,因此用户通常不会在设备上再次看到该应用的警报。

首次安装应用时,需要解决这些警报。 如果以前已接受请求,则本地运行的测试可能无法找到警报。

在 App Center Test 中执行测试时,这些测试在原始设备上运行,当应用程序尝试访问受保护的服务或功能时,会触发警报。

在 App Center 测试中处理这些警报因测试框架而异。

Xamarin.UITest 和 Calabash iOS

Xamarin.UITest 和 Calabash 会自动接受他们知道的警报。 已知警报基于文本匹配。 如果出现 SpringBoard 警报未消除的情况,请在 DeviceAgent.json文件中搜索警报标题。

$ cd DeviceAgent.iOS
$ git pull
$ find Server/Resources.xcassets -name "alerts.json" -exec grep -q "to access your location" {} \; -print
Server/Resources.xcassets/springboard-alerts/springboard-alerts-en_GB.dataset/alerts.json
Server/Resources.xcassets/springboard-alerts/springboard-alerts-en_AU.dataset/alerts.json
Server/Resources.xcassets/springboard-alerts/springboard-alerts-en.dataset/alerts.json

如果应用程序有不在该文件中的警报,请转到 ? > 请联系 App Center 网站中的支持人员以添加他们。 如果它们已在该文件中,则设备配置可能存在一些问题,应将其作为 bug 报告给 App Center 测试支持。

注意

你可能会在 Xamarin.UITest API 中注意到 DismissSpringboardAlerts()DismissSpringboardAlerts() 是 Xamarin.UITest 在内部使用的方法。 通常不需要在用户测试代码中调用 DismissSpringboardAlerts()

XCUITest 与 UIAutomation

Xamarin.UITest 和 Calabash 使用两个 Apple 测试框架之一来与设备交互。

  • 如果在本地运行测试,则 Apple 测试框架为 XCUITest
  • 如果在使用 iOS 10 或更高版本的 App Center Test 中运行测试,则 Apple 测试框架为 XCUITest
  • 如果在 App Center Test 中运行测试(iOS 版本早于 iOS 10),则使用的是 Apple 的 UIAutomation

使用 UIAutomation 进行测试需要在出现第一个警报之前延迟应用程序,以便 Apple 的 UIAutomation 框架控制受测应用程序。 如果这是应用程序和测试的问题,请参阅 管理隐私警报:位置服务、APNS、联系人

Calabash iOS

除了自动处理警报(如 Xamarin.UITest)外,Calabash 还允许手动管理警报。

  • 若要检查是否显示警报并查询其属性,请参阅 /springboard-alertQueryRoutes.m 中的 。
  • 若要消除警报,请通过触摸具有给定标题的按钮,请参阅 /set-dismiss-springboard-alertGestureRoutes.m
  • 若要消除已知警报并切换自动消除,请参阅 /dismiss-springboard-alertsMetaRoutes.m 中的 和 /set-dismiss-springboard-alerts-automatically 。 如果 /dismiss-spring-board-alerts 调用 并遇到未知警报,则会引发异常。

此 Calabash iOS 代码片段演示如何使用这些方法:

...
# Turn off automatic alert dismissal
device_agent.dismiss_springboard_alerts_manually!

# Do whatever triggers the alert, then wait for the alert
# that may or may not appear.
begin
  device_agent.wait_for_springboard_alert(10) # timeout is optional
  device_agent.dismiss_springboard_alert("OK")
rescue RuntimeError
   # Alert didn't appear, so there's nothing to do
end
...

# Turn automatic dismiss back on
dismiss_springboard_alerts_automatically!

Appium

请参阅 警报的 Appium 文档。

XCUITest

请参阅 监视 UI 中断的 Apple 文档。

获取帮助

始终可以通过 右上角的 ?“图标与我们联系。 我们不提供全天候支持,但会尽快回复。

如果需要有关测试运行的帮助,请导航到有问题的测试运行,并从浏览器中复制 URL 并将其粘贴到支持对话中。 测试运行 URL 类似于 https://appcenter.ms/orgs/OrgName/apps/App-Name/test/runs/77a1c67e-2cfb-4bbd-a75a-eb2b4fd0a747