是否可以区分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设备时, didEnterBackground
和willEnterForeground
通知也会发出,因此无法区分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 ,这些是关于UIApplication
或UIApplicationDelegate
的唯一更改,所以我找不到它们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屏幕。
所以,你应该检查applicationDidEnterBackground:
的UIApplication
的applicationState
属性。 如果是UIApplicationStateBackground
则用户按下主页button。 但是,如果是UIApplicationStateInactive
则用户locking设备。
有关苹果开发者论坛上的这个问题的线程 (仅限注册开发人员,对不起)。 要点是新的行为是devise的。 有一个新的APIfunction的要求来区分两个用例,但没有任何工作。