是否可以区分locking设备和发送应用程序到背景?

我有一个应用程序需要做一些事情,当它被发送到后台使用主页button和其他的东西,当设备被locking使用顶部的硬件button。 解决这些需求的标准方法是通过UIApplication发出的通知和委托方法。 在iOS 4上,它们看起来像这样:

 // Pressing the home button Will resign active. Did enter background. // Tapping app icon on Springboard Will enter foreground. Did become active. // Pressing the lock button Will resign active. // Unlocking the device Did become active. 

换句话说,在locking和背景之间很容易判断。 在iOS 5上,行为改变了:

 // Pressing the home button Will resign active. Did enter background. // Tapping app icon on Springboard Will enter foreground. Did become active. // Pressing the lock button Will resign active. Did enter background. // Unlocking the device Will enter foreground. Did become active. 

请注意,即使在(取消)locking设备时, didEnterBackgroundwillEnterForeground通知也会发出,因此无法区分locking和背景。 这种变化是否logging在某个地方? 这是回归吗? 你知道另一种区分这两种情况的方法吗?

iOS 6

在我通过模拟器进行的初步testing中,检查应用程序状态

 [[UIApplication sharedApplication] applicationState] 

在任何一个

 - (void)applicationWillEnterForeground:(UIApplication *)application - (void)applicationDidEnterBackground:(UIApplication *)application 

允许您区分locking设备的呼叫和切换回主屏幕。 一个locking屏幕将返回1(UIApplicationStateInactive),而主页button按下将注册为2(UIApplicationStateBackground)。

这似乎是一致的,应该像在模拟器中那样可靠地在iOS设备上工作。

IOS 7

iOS 6方法不再适用于iOS 7.为了实现这一点,您必须使用CFNotificationCenter并监听达尔文通知(标记为:com.apple.springboard.lockcomplete)。 你可以在这里find示例项目的github回购: https : //github.com/binarydev/ios-home-vs-lock-button

信贷的iOS 7修补程序出去wqq

我已经仔细研究了这一点,所以如果有人知道我不知道的东西,我很想在这里做错,但是从技术上讲,没有文档的方式来说明locking设备和发送到背景之间的区别。

但是有一点你可以检查,就是在从前景到背景的过渡期间的UIApplicationState 。 locking一个设备将给UIApplicationStateInactive和移动应用程序的背景将给UIApplicationStateBackground 。 但是,由于这种行为没有正式logging,将来可能会改变。

一个基本的例子:

 - (void)applicationDidEnterBackground:(UIApplication *)application { UIApplicationState state = [[UIApplication sharedApplication] applicationState]; NSLog(@"Device state: %@", state); switch (state) { case UIApplicationStateActive: /* ... */ break; case UIApplicationStateInactive: /* Device was/is locked */ break; case UIApplicationStateBackground: /* User pressed home button or opened another App (from an alert/email/etc) */ break; } } 

UIApplicationState – 应用程序的运行状态

 typedef enum { UIApplicationStateActive, UIApplicationStateInactive, UIApplicationStateBackground } 

UIApplicationState

常量

UIApplicationStateActive – 应用程序在前台运行并且正在接收事件。 在iOS 4.0及更高版本中可用。

UIApplicationStateInactive – 应用程序在前台运行,但没有接收事件。 这可能是由于中断或应用程序正在转换到或从后台转换而发生的。

UIApplicationStateBackground – 应用程序正在后台运行。


根据UIApplicationDelegate协议参考 :

 applicationWillResignActive: didEnterBackground: // ... willEnterForeground: applicationDidBecomeActive: 

是在这两种情况下唯一被调用的方法。


根据iOS 4.3到iOS 5.0 API Diff ,这些是关于UIApplicationUIApplicationDelegate的唯一更改,所以我找不到它们logging了这些通知更改的位置:

 UIApplication.h Added -[UIApplication setNewsstandIconImage:] Added UIApplication.userInterfaceLayoutDirection Added UIApplicationDelegate.window Added UIApplication(UINewsstand) Added UIApplicationLaunchOptionsNewsstandDownloadsKey Added UIRemoteNotificationTypeNewsstandContentAvailability Added UIUserInterfaceLayoutDirection Added UIUserInterfaceLayoutDirectionLeftToRight Added UIUserInterfaceLayoutDirectionRightToLeft 

这是更多的解决方法/黑客,但根据我的经验,这是非常可靠的。 当设备被屏蔽locking(不只是主页button,如果这是一个字:)) – 绑定networking(UDP)套接字被打破。 我使用的是GCDAsyncUDPSocket(之前也是AsyncUDPSocket),当设备closures时,它们都会可靠地触发networking/断开的pipe道错误。 在我的情况下,无论如何我需要UDP套接字,对于其他应用程序,它可能有点臭,然而,只要绑定/监听UDP套接字没有任何行动是不是太可怕,如果你真的需要区分这里。

本说明将[自毁]; 是5分钟(所以苹果不知道)。

这是苹果的iOS编程指南所说的:

按睡眠/唤醒button是另一种types的中断,导致您的应用程序暂时停用。 当用户按下此button时,系统禁用触摸事件,将应用程序移动到后台,但将应用程序的applicationState属性的值设置为UIApplicationStateInactive(而不是UIApplicationStateBackground),最后locking屏幕。

http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

所以,你应该检查applicationDidEnterBackground:UIApplicationapplicationState属性。 如果是UIApplicationStateBackground则用户按下主页button。 但是,如果是UIApplicationStateInactive则用户locking设备。

有关苹果开发者论坛上的这个问题的线程 (仅限注册开发人员,对不起)。 要点是新的行为是devise的。 有一个新的APIfunction的要求来区分两个用例,但没有任何工作。