如何使UITests-Runner能够访问隐私敏感数据

3
我正在运行一个 UITests 用例,使用 UIImageWriteToSavedPhotosAlbum() 函数将我的测试截图保存到照片相册中:
- (void)testExample
{
  XCUIScreenshot *screenshot = [_app screenshot];
  UIImageWriteToSavedPhotosAlbum(screenshot.image, nil, nil, nil);
}

但是它崩溃并显示错误:

... XXXUITests-Runner[53905:8592232] [access] 应用程序因未提供使用说明而尝试访问隐私敏感数据而崩溃。应用程序的 Info.plist 必须包含一个 NSPhotoLibraryAddUsageDescription 键,其字符串值解释了应用程序如何使用此数据。

我已经在我的 UITest Target 和 App Target 中提供了 NSPhotoLibraryUsageDescription 和 NSPhotoLibraryAddUsageDescription。

我搜索了一段时间,但至今无法找到一种方法使 UITests-Runner 能够将图像保存到照片应用中,没有 UI 级别的操作可以让我允许它。

那么,我该如何实现这一点,即使 UITests-Runner 能够访问隐私敏感数据(在本例中为照片)?


示例项目可在此处获得:

UITestRunnerIssueDemo

以下是相关的错误详细信息:

测试套件 'All tests' 开始于 2018-05-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 截图,但是如果我可以从照片相册中获取它们将会很方便,特别是在实际设备上这样做时,我不想每次都下载应用程序容器以获取那些截图(而且,我需要保存高质量的截图)。


1
更新:我已经发送了TSI并收到回复:“我们的工程师已经审查了您的请求,并确定您正在遇到一个已知问题,目前没有已知的解决方法。” 正如建议的那样,我提交了相关的错误报告(#40317463),希望它能在未来的Xcode版本中得到处理。 - Kjuly
1个回答

2

我现在遇到了完全相同的问题,我的临时解决办法是将图像保存代码放在:

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

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


似乎有一个选项,但我想知道如何在内部主机应用程序中获取 XCUIScreenshot *screenshot = [_app screenshot];。或者你只是将视图呈现为截图图像吗?个人而言,我不喜欢在主机应用程序中涉及测试相关代码,但是,可以作为临时解决方法。目前,我只在模拟器中执行此操作,并将其保存在其他地方,而不是照片应用程序中。 - Kjuly
将视图渲染为屏幕截图,并将其保存在 #if DEBUG UIImageWriteToSavedPhotosAlbum([self captureScreen], nil, nil, nil); #endif 中。 - nex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接