如何在iPhone模拟器中测试相机?

147

在不需要部署到设备上的情况下,有没有办法在模拟器中测试iPhone相机?这种方式似乎非常繁琐。

8个回答

152

有一些设备特定的功能需要在设备上进行测试,但使用模拟器并不比它更困难。只需为设备构建一个调试目标并将其连接到计算机即可。

需要真实设备才能执行的操作列表:

  • 实际手机
  • 相机
  • 加速度计
  • 真实 GPS 数据
  • 指南针
  • 震动
  • 推送通知...

72
有点糟糕,如果你需要在部署目标中设置的早期操作系统版本上进行测试,那你会怎么办呢?我想你会很难受。 - marchinram
2
以下是如何降级您的设备的说明:http://www.iclarified.com/31004/how-to-downgrade-from-ios-7-beta-to-ios-6 - knagode
5
推送通知也不是只有设备才具备的功能吗? - mgarciaisaia
20
我没有iOS设备。如果我想在真实设备上测试,我需要向别人请求……这很糟糕。 - Luca
23
并非所有开发iOS应用的人都拥有iOS设备。wtf(表达不满或惊讶的俚语)。 - pete
显示剩余6条评论

9

我需要测试一些自定义照片叠加效果。这些叠加效果需要根据图像的大小/分辨率进行调整。

我采用了类似于Stefan的建议的方法,决定编写一个“虚拟”相机响应程序。

当模拟器运行时,我执行这个虚拟代码,而不是标准的“captureStillImageAsynchronouslyFromConnection”代码。

在这个虚拟代码中,我构建了一个必要分辨率的“黑色照片”,然后将其通过管道发送,以便像普通照片一样处理。实质上提供了非常快速相机的感觉。

CGSize sz = UIDeviceOrientationIsPortrait([[UIDevice currentDevice] orientation]) ? CGSizeMake(2448, 3264) : CGSizeMake(3264, 2448);
UIGraphicsBeginImageContextWithOptions(sz, YES, 1);
[[UIColor blackColor] setFill];
UIRectFill(CGRectMake(0, 0, sz.width, sz.height));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

NSData *imageData = UIImageJPEGRepresentation(image, 1.0);

上面的图片相当于当前大多数设备发送的8MP照片。显然,要测试其他分辨率,你需要更改尺寸。

聪明的@Craig-我最近在一个项目中做了类似的事情(也许不是很聪明),但使用了存储在资源中的图片。这样就可以使用fastlane自动化截图并发送到iTunesConnect。 - Moose

3

我从未尝试过,但你可以试试看!iCimulator

iCimulator


1
我正要用同一个代码库来回答XD。最好的问候。 - Andres Paladines

2
不行(除非他们在3.2中添加了一种方法,但我还没有检查)。

0

访问相机的常见原因是为了在AppStore中制作屏幕截图。

由于模拟器中没有相机,一个好的技巧(我所知道的唯一一个)是将你的视图调整到所需的大小,仅用于拍摄屏幕截图。稍后可以裁剪它们。

当然,你需要有具有更大屏幕的设备可用。

iPad非常适合测试布局并为所有设备制作快照。iPhone6+的截图必须略微拉伸(按比例缩放为1.078125 - 没有太大问题...)

查看iOS设备分辨率快速参考的好网站: http://www.iosres.com/


编辑:在最近的一个项目中,我使用了自定义相机视图控制器,将AVPreview替换为UIImageView,用于仅在模拟器中运行的目标。这样,我可以自动化iTunesConnect上传的截屏。请注意,相机控制按钮不在叠加层中,而是在相机预览上方的视图中。

@Craig下面的答案描述了另一种方法,我觉得非常聪明 - 它也适用于相机叠加层,与我的方法相反。


4
问题的重点就在这里……模拟器中没有摄像头。 - Moose
1
为什么需要相机来截屏? - Raphael
5
为了在商店中展示您的摄像头应用在不同屏幕尺寸下的运行情况,您需要拍摄摄像头应用的截屏。 - Moose

0
刚在 git 上发现了一个仓库,可以在 iOS 模拟器上使用图像、视频或 MacBook 相机模拟相机功能。仓库

0

我编写了一个替代视图,在调试模式下使用。它实现了相同的 API 并进行相同的委托回调。在我的情况下,我让它从我的测试集中返回一个随机图像。编写起来非常简单。


3
而且,您可以让它从iSight相机返回图像 :) - user142019

0

另一种选择是,在macOS 13+(也许是macOS 12)和Xcode 14+上,通过“我的Mac(专为iPhone设计)”Xcode目标运行iPhone应用程序。

My Mac (Designed for iPhone)

"捕获并保存照片" Swift Playground提供了iOS示例代码,使用了macOS实时摄像头。

_注意:arm64 Mac可以直接运行“我的Mac(适用于iPhone)”。但是,x86_64需要使用“Mac(Mac Catalyst)”才能使用基于iOS的API调用来使用实时摄像头。


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