如何从后台检测iOS设备的方向?

4

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

这不是一个应用商店应用程序,因此它没有像应用商店应用程序通常适用的规则。即使这个应用程序使用私有API也可以,但它必须在未越狱的设备上运行。(该应用程序将是企业级应用程序)

该应用程序需要知道当前设备的方向。看似简单,但实际上并不是。我正在使用您期望的普通代码:

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

然而,似乎这将返回应用程序从前台切换到后台时生效的方向。
我需要跟踪实际设备方向的方向。实际上,我真正想要的是当前前台应用程序的用户界面方向,但苹果公司让推断变得非常困难。如果必须,我会接受设备方向。
该应用程序是用Objective-C编写的,但我也“说Swift”,因此以任一语言表达的答案均可。

这只是个初步想法:有一些框架带有私有的deviceOrientation属性(https://github.com/nst/iOS-Runtime-Headers/search?utf8=%E2%9C%93&q=deviceorientation),还有一个名为`currentDeviceOrientationAllowingAmbiguous:`的私有`UIDevice`方法,当然还有`[UIApplication -statusBarOrientation]`。你试过它们中的任何一个吗? - Aaron Brager
这里有一种方法,使用Core Motion的CMMotionManager来计算设备方向。 - Aaron Brager
你需要字面上“追踪”方向,也就是在你的应用程序后台运行时记录所有更改吗?还是只需要知道应用程序从后台返回时的方向?如果是后者,在AppDelegate中的applicationWillEnterForeground:中可以检查设备方向。 - William Smith
我真正需要的是前台应用程序的用户界面方向。使用核心运动可能是一个不错的折衷,但如果设备被定向锁定,或者用户将其平放在桌子上,或者其他各种情况,它就会与UI方向不同步。 - Duncan C
一个私有框架,让我可以查询前台应用程序的用户界面(或其状态栏方向)将是理想的。 - Duncan C
显示剩余2条评论
2个回答

6

有一个名为-[UIApplication _getSpringBoardOrientation]的私有方法,它只是调用另一个私有方法-[UIApplication activeInterfaceOrientation],似乎可以给出当前前台应用程序的方向。


这是UIApplication的类方法还是实例方法?第二个呢?我猜我需要编写一些代码来查询UIApplication的私有方法... - Duncan C
这个方法签名在运行时崩溃了:- (UIInterfaceOrientation) _getSpringBoardOrientation - Duncan C
这是UIApplication上的一个实例方法。[[UIApplication sharedApplication] activeInterfaceOrientation] 应该能正常工作,至少在lldb中是可以的。 - Sascha
哦,我的错。我犯了一个错误,并将其作为UIDevice的方法而不是UIApplication的方法。有趣的是,应用程序对象的一个方法告诉您另一个应用程序的方向。 - Duncan C
[[UIApplication sharedApplication] activeInterfaceOrientation] 方法似乎正好给了我需要的东西。谢谢!(已投票并接受。) - Duncan C

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

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