在iPhone上确定飞行模式是否已启用?

10

更新:自 iOS 8(可能是 8.3 版本)之后,即使在飞行模式下也可以打开 GPS 硬件(即您甚至可以在飞行模式下获取 GPS 位置)。这使得该问题没有意义。

--

是否可以通过编程方式确定 iPhone 是否处于飞行模式?我特别想知道它是否处于飞行模式,而不是是否有网络连接。尽管已经有很多人问过这个问题,但我看到的每一个答案都提到了 Apple 的 Reachability 代码来确定是否可用网络连接。

我正在编写一款使用 iPhone 的 GPS 的应用程序。目前,如果打开飞行模式并启动我的应用程序,我的位置管理器对象仍然存在,并且似乎仍然给我提供(缓存的?)位置。小小的 GPS 图标会出现在状态栏中,以让我知道我的应用程序正在确定位置。

Airplane Mode and GPS arrow indicator

我想知道手机是否处于飞行模式,以便我可以不初始化位置管理器对象,并更改我的用户界面以指示 GPS 功能不可用。

GPS 功能显然可以在无论是否有网络连接的情况下使用,因此缺乏网络连接似乎是飞行模式的一个很差的代理。当处于飞行模式时,我似乎没有收到任何特定的错误(通过 locationManager: didFailWithError),只是一个通用的错误,我认为它可能来自多个来源。

4个回答

6

我的应用有类似的要求,但我事先知道它最有可能在"无信号"环境下使用(比如野营),并且用户可能为了省电将设备设置为飞行模式,而不知道这将关闭GPS。

由于飞行模式不会导致didFailWithError错误,并且locationServicesEnabled返回yes,所以我设置了一个60秒的计时器,如果计时器到期前没有返回GPS读数,我会向用户显示一条消息,告诉他们无法读取GPS数据,并建议他们检查是否启用了飞行模式,并确保他们有清晰的天空视野。


谢谢。这就是我最终做的事情。 - Stewart Macdonald
应该在错误消息中向用户提及的另一种情况是,他们应该验证应用程序已被授予访问GPS数据的权限。我曾经遇到过一个用户坚称应用程序出了问题,结果发现他在权限弹出窗口上点击了“不允许”。 - software evolved
1
如果用户未为您的应用启用位置服务,则在locationManager:didFailWithError:方法中应该获得kCLErrorDenied错误结果。我有一个特定的错误对话框来处理这种情况。如果设备处于飞行模式,则会收到通用的kCLErrorLocationUnknown错误。 - Stewart Macdonald
1
我已经在iOS7和iOS8下进行了广泛的测试。在飞行模式下,LocationServices将调用locationManager:didFailWithError:代理,并返回kCLErrorDomain 0的错误。如果您的应用程序被授权使用位置服务,则authorizationStatus将为kCLAuthorizationStatusAuthorized,因为您已获得授权...硬件仅仅缺少完成请求所需的电源。(我猜测一个坏的GPS芯片会返回类似的结果。) - Robert Altman

3
我不确定是否可以通过使用公共类来获取此信息,但如果您需要提醒用户他正在飞行模式下,因此应用程序功能受到限制,可以在Info.plist文件中将UIRequiresPersistentWiFi属性设置为"true"。然后,当设置了飞行模式时,您将收到此消息。 顺便提一下,与仅检查飞行模式状态相比,这种方法更好,不仅因为它得到系统支持,而且因为如果用户启用飞行模式,然后重新启用Wi-Fi(仍停留在飞行模式下),则不会显示系统警报。

谢谢。我已经在做这个了,但我觉得这有点欺骗(因为我的应用程序不需要任何网络连接,更不用说WiFi连接了)。我还认为它对电池寿命有负面影响,因为我理解它会保持WiFi连接处于活动状态。也许你是对的 - 也许没有办法获取这些信息。 - Stewart Macdonald

2

一种解决方案可能是对设备进行屏幕截图并查看该区域中存在的颜色。如果它们是橙色的,那么你就处于飞行模式。


3
我喜欢你的侧面思维,但我想这种解决方案可能会在不同版本的iOS和可能不同的硬件上容易出现故障。如果我找不到其他可行的方案,我可能会尝试这个。 - Stewart Macdonald
是的,这绝对是一个hacky的解决方案。一个内置的API会更好。 - ceejayoz
2
当您在设备上截屏时,状态栏不会被包含在内。 - Hot Licks
@ceejayoz - 我的没有,在使用“批准”的API时进行手机拍摄时。 - Hot Licks

0

你真的不应该尝试检查飞行模式是否已启用。如果苹果更改了飞行模式的工作方式,即使打开了飞行模式,GPS设备也仍处于启用状态,那么会怎样呢?检测GPS服务是否已启用的最可靠方法是实现CLLocationManagerDelegate并让API告诉您GPS是否可用。

检查传递给您的NSError将让您知道是否存在问题。


是的,但这并不会告诉我GPS不可用是因为设备处于飞行模式。 - Stewart Macdonald
飞行模式设置不会改变[CLLocationManager locationServicesEnabled]或[CLLocationManager authorizationStatus]的结果。 - Robert Altman

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