当前位置: 首页 > 面试题库 >

如何在Swift中检测是否正在为设备或模拟器构建应用程序

杭泉
2023-03-14
问题内容

在Objective-C中,我们可以知道是否正在使用宏为设备或模拟器构建应用程序

#if TARGET_IPHONE_SIMULATOR
    // Simulator
#else
    // Device
#endif

这些是编译时宏,在运行时不可用。

如何在Swift中实现相同目标?


问题答案:

尽管此答案可能有效,但建议进行静态检查的解决方案(如几位Apple工程师所阐明的那样)是定义一个针对iOS模拟器的自定义编译器标志。

原始答案

如果您需要静态检查(例如不需要运行时if/else),则无法直接检测到模拟器,但是可以在如下所示的桌面体系结构上检测iOS

#if (arch(i386) || arch(x86_64)) && os(iOS)
    ...
#endif

之后 雨燕4.1 版本

最新用途,现在可以在一种情况下直接用于所有类型的模拟器,而只需要应用一种情况-

#if targetEnvironment(simulator)
  // your simulator code
#else
  // your real device code
#endif

有关更多说明,您可以查看 Swift 提案SE-0190

对于旧版本 -

显然,这在设备上为false,但对于iOS
Simulator,返回的结果为true,如文档中所指定:

为32位iOS模拟器编译代码时,arch(i386)构建配置将返回true。

如果您是为iOS以外的模拟器开发的,则只需更改os参数即可:

检测 watchOS 模拟器

#if (arch(i386) || arch(x86_64)) && os(watchOS)
...
#endif

检测 tvOS 模拟器

#if (arch(i386) || arch(x86_64)) && os(tvOS)
...
#endif

甚至可以检测 任何 模拟器

#if (arch(i386) || arch(x86_64)) && (os(iOS) || os(watchOS) || os(tvOS))
...
#endif

相反,如果可以运行时检查,则可以检查TARGET_OS_SIMULATOR变量(或TARGET_IPHONE_SIMULATOR在iOS
8及更低版本中),这在模拟器上是正确的。

请注意,这与使用预处理器标志不同,并且受到的限制更大。例如,您将无法在a if/else语法上无效的地方使用它(例如,在函数作用域之外)。

例如,假设您要在设备和模拟器上具有不同的导入。对于动态检查,这是不可能的,而对于静态检查,这是微不足道的。

#if (arch(i386) || arch(x86_64)) && os(iOS)
  import Foo
#else
  import Bar
#endif

另外,由于该标志被快速预处理器替换为a 0或a 1,因此,如果直接在if/else表达式中使用它,则编译器将发出有关代码无法到达的警告。

为了变通解决此警告,请参阅其他答案之一。



 类似资料:
  • 问题内容: 我相信有更好,更合适的方法来做到这一点。但是现在我正在使用UIScreen.main.bounds来检测是否正在处理iPhone X(812高)。顺便说一句,这个特定的应用程序仅适用于风景。这就是我在此功能中要为幻灯片视图创建幻灯片的地方: 但是,如何检查模型? 问题答案: 如果您需要检测设备是否为iPhoneX,请不要使用,这取决于设备的方向。因此,如果用户以纵向模式打开您的应用程序

  • 我最近升级到Xcode 6,在AppAgent中加载视图控制器时开始出现奇怪的崩溃。例如,我发现这行代码: …当我在iPhone5模拟器上运行应用程序时,并不总是返回YES!因此,该应用程序试图加载iPad笔尖,结果崩溃。 现在我只在实际设备上进行测试。但是有人可以告诉我xcode/模拟器如何做出这样的失误吗?以及如何保护自己免受其害。

  • 问题内容: 我想以编程方式确定是否直接从XCode(在模拟器中或在系留设备上)运行iOS应用。我尝试了此处描述的-DDEBUG解决方案,但是当我断开与Xcode的连接并重新运行该应用程序时,它仍然认为它处于调试模式。我认为我正在寻找的是此功能的Swift版本 问题答案: 说明: 您的C代码(以及下面的Swift版本)检查程序是否在 调试器的控制 下运行 , 而不是是否从Xcode运行。一个人可以在

  • 问题内容: 我想知道是否有可能检测浏览器是否在iOS上运行,这与使用Modernizr进行功能检测的方式类似(尽管这显然是设备检测而非功能检测)。 通常,我宁愿使用功能检测,但我需要根据该问题确定设备是否为iOS,因为它们处理视频的方式YouTube API无法在iPad / iPhone/非Flash设备上使用 问题答案: 我不喜欢User Agent嗅探,但是这是你的处理方式: 另一种方法是依

  • 问题内容: 我们有一个基于Java的应用程序,其中我们要检测发送请求的设备的设备类型(移动设备或台式机)。 这怎么可能? 问题答案: 您必须从请求中读取标头,然后决定。 在普通的servlet应用程序中,一种粗略的实现方式是:

  • 在过去,android模拟器非常慢,我只使用设备来调试android应用程序。 React原生应用程序的首选开发环境、模拟器或设备是什么?