【问题标题】:How to detect iOS device orientation from background?如何从后台检测 iOS 设备方向?
【发布时间】:2015-12-11 21:21:04
【问题描述】:

我正在为在后台运行的客户端开发一个应用程序。

它不是应用商店应用,因此它与通常适用于应用商店应用的规则并不完全相同。甚至私有 API 也是此应用程序的一个选项,但它必须在非越狱设备上运行。 (该应用程序将是一个企业应用程序。)

应用需要知道当前的设备方向。看似简单,其实不然。我正在使用您期望的普通代码:

UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
BOOL inLandscape = UIDeviceOrientationIsLandscape(deviceOrientation);

但是,这似乎返回了当应用程序从前台移动到后台时有效的方向。

我需要方向来跟踪实际的设备方向。实际上,我真正想要的是当前前台应用程序的用户界面方向,但 Apple 很难推断。如果需要,我会满足于设备方向。

这个应用程序是用 Objective-C 编写的,但我也“说 Swift”,所以用任何一种语言表达的答案都可以。

【问题讨论】:

  • 在这里吐槽一下:有一些框架带有private deviceOrientation properties,一个私有的UIDevice 方法称为currentDeviceOrientationAllowingAmbiguous:,当然还有[UIApplication -statusBarOrientation]。您尝试过其中的任何一个吗?
  • Here's an approach 使用 Core Motion 的 CMMotionManager 来计算设备方向。
  • 您是否需要逐字地“跟踪”方向,例如在应用程序处于后台时维护所有更改的记录?或者您只需要知道应用程序从后台返回时的方向?如果是后者,您可以在 AppDelegate 中的 applicationWillEnterForeground: 中检查设备方向。
  • 我真正需要的是前端应用程序的用户界面方向。使用核心运动可能是一个不错的折衷方案,但如果设备方向锁定、用户将其平放在桌子上或其他各种情况,它会与 UI 方向不同步。
  • 一个可以让我查询最前面应用程序的用户界面(或它的状态栏方向)的私有框架将是理想的。

标签: ios uideviceorientation


【解决方案1】:

有一个名为-[UIApplication _getSpringBoardOrientation] 的私有方法,它只是调用另一个私有方法-[UIApplication activeInterfaceOrientation],这似乎为您提供了当前前台应用程序的方向。

【讨论】:

  • 这是UIApplication的类方法还是实例方法?第二个呢?我想我需要编写一些代码来询问 UIApplication 的私有方法...
  • 此方法签名在运行时崩溃:- (UIInterfaceOrientation) _getSpringBoardOrientation
  • 它是 UIApplication 上的一个实例方法。 [[UIApplication sharedApplication] activeInterfaceOrientation] 应该可以工作,至少在 lldb 中可以。
  • 哦,我的错。我犯了一个错误,把它变成了 UIDevice 的方法,而不是 UIApplication。有趣的是应用程序对象的一个​​方法告诉你另一个应用程序的方向。
  • [[UIApplication sharedApplication] activeInterfaceOrientation] 方法似乎可以满足我的需求。谢谢! (投票并接受。)
【解决方案2】:

我问苹果这个问题,他回答说要使用Core Motion

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多