【问题标题】:Determining if Airplane Mode is enabled on an iPhone?确定 iPhone 上是否启用了飞行模式?
【发布时间】:2011-12-03 12:12:04
【问题描述】:

更新:从 iOS 8 的某些版本(可能是 8.3)开始,即使在飞行模式下也可以打开 GPS 硬件(即,即使在飞行模式下也可以获取 GPS 位置)。这使得这个问题没有实际意义。

--

是否可以通过编程方式确定 iPhone 是否处于飞行模式?我特别想知道它是否处于飞行模式,而不是拥有(或没有)网络连接。这个问题被问了很多,但我看到的每个答案都参考了 Apple 的可达性代码来确定网络连接是否可用。

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

我想知道手机是否处于飞行模式,这样我就无法初始化位置管理器对象,并且我可以更改我的 UI 以向用户指示 GPS 功能不可用。

无论网络连接如何,显然都可以使用 GPS 功能,因此缺乏网络连接让我觉得它是飞行模式的不良代理。在飞行模式下,我似乎没有收到任何特定错误(通过 locationManager: didFailWithError),只是我假设可能来自多个来源的一般错误。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    我不知道是否有可能获得此信息,至少使用公共课程,但如果您需要提醒用户他处于飞行模式,因此应用程序功能有限,您可以在您的Info.plist 将UIRequiresPersistentWiFi 属性设置为“true”。然后,当设置飞行模式时,您将收到此消息。 顺便注意一下,这种方法比仅仅检查飞行模式状态要好,除了因为它是系统支持的,就像用户启用飞行模式然后重新启用 Wi-Fi(仍然停留在飞行模式)然后系统不会显示警报。

    【讨论】:

    • 谢谢。我已经在这样做了,但在我看来,这似乎是一个软糖(因为我的应用程序不需要任何网络连接,更不用说 WiFi 连接了)。我还认为它对电池寿命有负面影响,因为我的理解是它保持 WiFi 连接处于活动状态。也许你是对的——也许没有办法得到这些信息。
    【解决方案2】:

    一个解决方案可能是take a screenshot of the device 并查看该区域中存在的颜色。如果它们是橙色的,则说明您处于飞行模式。

    【讨论】:

    • 我喜欢你的横向思维,但我想这个解决方案很容易在不同版本的 iOS 和不同的硬件上崩溃。如果我不能让其他任何工作,我可能会试一试。
    • 是的,这绝对是一个 hacky 解决方案。内置 API 会更好。
    • 当您在设备上截屏时,状态栏不包括在内。
    • @ceejayoz - 我的手机没有使用“已批准”的 API。
    【解决方案3】:

    对我的应用有类似要求,但我事先知道它很可能会在“无手机信号”环境(在偏远地区露营)中使用,并且用户可能会将设备置于飞行模式以节省电池,却没有意识到它会关闭 GPS。

    由于飞行模式不会导致 didFailWithError,并且 locationServicesEnabled 返回 yes,我将计时器设置为 60 秒,如果在计时器到期之前没有返回 GPS 读数,我会向用户显示一条消息,告诉他们 GPS 数据无法阅读,并建议他们检查是否未启用飞行模式,并确保他们可以清楚地看到天空。

    【讨论】:

    • 谢谢。这就是我最终要做的。
    • 错误消息中应该向用户提及的另一种情况是,他们应该验证应用程序是否已被授予访问 GPS 数据的权限。我有一个用户坚持认为该应用程序已损坏,只是发现他在权限弹出窗口中点击了“不允许”。
    • 如果用户没有为您的应用启用定位服务,您应该在locationManager:didFailWithError: 方法中得到kCLErrorDenied 错误结果。我有一个特定的错误对话框来处理这种情况。如果设备处于飞行模式,您会收到一般的 kCLErrorLocationUnknown 错误。
    • 我已经在iOS7和iOS8下进行了广泛的测试;在飞行模式下,LocationServices 将调用 locationManager:didFailWithError: 委托,错误为 kCLErrorDomain 0。如果您的应用被授权使用位置服务,则授权状态将是 kCLAuthorizationStatusAuthorized,因为您已获得授权......硬件只是缺少实现的能力请求。 (我猜一个糟糕的 GPS 芯片会返回类似的结果。)
    【解决方案4】:

    您真的不应该尝试检查飞行模式是否启用。如果 Apple 改变飞行模式的工作方式,即使打开 GPS 设备也会保持启用状态怎么办?可靠检测是否启用 GPS 服务的最佳方法是实现 CLLocationManagerDelegate 并让 API 告诉您 GPS 是否可用

    检查NSError它可能会传递给你,如果有问题,你会知道

    【讨论】:

    • 是的,但这不会告诉我由于设备处于飞行模式而导致 GPS 不可用。
    • 飞行模式设置不会改变 [CLLocationManager locationServicesEnabled] 或 [CLLocationManager authenticationStatus] 的结果。
    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 2012-01-28
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多