【问题标题】:How to make UITests-Runner able to access privacy-sensitive data如何让 UITests-Runner 能够访问隐私敏感数据
【发布时间】:2018-10-20 06:22:46
【问题描述】:

我正在运行带有UIImageWriteToSavedPhotosAlbum() 的 UITests 案例,以将我的测试屏幕截图保存到相册:

- (void)testExample
{
  XCUIScreenshot *screenshot = [_app screenshot];
  UIImageWriteToSavedPhotosAlbum(screenshot.image, nil, nil, nil);
}

但它因错误而崩溃:

... XXXUITests-Runner[53905:8592232] [access] 此应用程序已崩溃,因为它试图在没有使用说明的情况下访问隐私敏感数据。应用的 Info.plist 必须包含一个 NSPhotoLibraryAddUsageDescription 键和一个向用户解释应用如何使用这些数据的字符串值。

我已将 NSPhotoLibraryUsageDescription 和 NSPhotoLibraryAddUsageDescription 提供给我的 UITest Target 和 App Target。

搜索了一段时间,到目前为止,我想不出一种方法让 UITests-Runner 能够将图像保存到照片应用程序,没有 UI 级别可以让我按下以允许它。

那么,我怎样才能做到这一点,即让 UITests-Runner 能够访问隐私敏感数据(在这种情况下为照片)?


此处提供示例项目:

UITestRunnerIssueDemo

以下是相关的错误详情:

测试套件“所有测试”于 2018 年 5 月 10 日 11:30:37.693 开始
测试套件“UITestRunnerIssueDemoUITests.xctest”开始于 2018-05-10 11:30:37.694
测试套件“UITestRunnerIssueDemoUITests”开始于 2018-05-10 11:30:37.694
测试用例“-[UITestRunnerIssueDemoUITests testExample]”已启动。
t = 0.00s 在 2018-05-10 11:30:37.695 开始测试
t = 0.05s 设置
t = 0.06s 打开 com.kjuly.UITestRunnerIssueDemo
t = 0.10s 启动 com.kjuly.UITestRunnerIssueDemo
t = 3.08s 等待 com.kjuly.UITestRunnerIssueDemo 空闲
t = 6.10s 找到目标应用程序 0x60c0000dd5e0
t = 6.25s 拆机
2018-05-10 11:30:43.948541+0800 UITestRunnerIssueDemoUITests-Runner[53905:8592232] [access] 这个应用程序已经崩溃,因为它试图在没有使用说明的情况下访问隐私敏感数据。应用的 Info.plist 必须包含一个 NSPhotoLibraryAddUsageDescription 键和一个字符串值,向用户解释应用如何使用这些数据。


顺便说一句,我知道我可以获取自动保存在 AppData/Library/Snapshots 文件夹下的 UITests 屏幕截图,但是如果我可以从相册中获取它会很方便,尤其是在真实设备中这样做时,我不愿意每次都为了获取这些屏幕截图而下载 App Container(而且,我需要保存的高质量屏幕截图)。

【问题讨论】:

  • 更新:我已经发送了一份 TSI 并刚刚收到回复 “我们的工程师已经审核了您的请求,并确定您遇到了一个已知问题目前没有已知的解决方法。” 并按照建议提交了相关的错误报告(#40317463),希望在进一步的 Xcode 版本中得到处理。

标签: ios xcode cocoa-touch xcode-ui-testing xcuiscreenshot


【解决方案1】:

我现在有完全相同的问题,对我有用的临时解决方法是放置图像保存代码:

  UIImageWriteToSavedPhotosAlbum(screenshot.image, nil, nil, nil);

在应用程序代码中,就像在调试模式下运行时一样。

【讨论】:

  • 似乎是一个选项,但我想知道你如何获得XCUIScreenshot *screenshot = [_app screenshot]; 内部主机应用程序?或者你只是在那里将视图渲染为屏幕截图图像?就个人而言,我不喜欢涉及测试相关代码内部主机应用程序,但是,是的,可以是一个临时的解决方法。目前,我只是在模拟器中进行操作并将其保存在其他地方,而不是照片应用程序。
  • 是的,将视图渲染为截图图像,并将其保存在#if DEBUG UIImageWriteToSavedPhotosAlbum([self captureScreen], nil, nil, nil); #endif
猜你喜欢
  • 1970-01-01
  • 2017-02-11
  • 2017-05-13
  • 2011-01-17
  • 2017-02-11
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多