我的应用程序要求在应用程序处于后台时检测手机屏幕是否打开/关闭?我发现使用私有框架Spring板可以实现这一点。 我们可以使用公共API吗?
感谢。
答案 0 :(得分:1)
试试这个:
AppDelegate.m中的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//Other code
[self registerforDeviceLockNotif];
}
//Register Notification
-(void)registerforDeviceLockNotif
{
//Screen screenDisplayStatus notifications
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, screenDisplayStatus, CFSTR("com.apple.iokit.hid.displayStatus"), NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
NULL, // observer
screenLockStatus, // callback
CFSTR("com.apple.springboard.lockstate"), // event name
NULL, // object
CFNotificationSuspensionBehaviorDeliverImmediately);
}
//RemoveNotification if you don't need any more.
-(void)removeforDeviceLockNotif{
CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, CFSTR("com.apple.iokit.hid.displayStatus"), NULL);
CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL, CFSTR("com.apple.springboard.lockstate"), NULL);
}
//Call back Methods
static void screenDisplayStatus(CFNotificationCenterRef center, void* observer, CFStringRef name, const void* object, CFDictionaryRef userInfo) {
uint64_t state;
int token;
notify_register_check("com.apple.iokit.hid.displayStatus", &token);
notify_get_state(token, &state);
notify_cancel(token);
if (state) {
screenIsBlack = NO;
}else{
screenIsBlack = YES;
}
}
static void screenLockStatus(CFNotificationCenterRef center, void* observer, CFStringRef name, const void* object, CFDictionaryRef userInfo)
{
uint64_t state;
int token;
notify_register_check("com.apple.springboard.lockstate", &token);
notify_get_state(token, &state);
notify_cancel(token);
if (state) {
screenIsLocked = YES;
}
else
{
screenIsLocked = NO;
}
}
当屏幕为黑屏时,您是否正在执行任务:
if (appIsBackground && (screenIsBlack || screenIsLocked) {
//do Task.
}
请注意,此处我已将屏幕锁定状态设为为黑屏,如果不需要,只需删除锁定状态判断。
答案 1 :(得分:0)
还要考虑处于后台模式的应用只会在暂停之前的一段时间内运行/执行任务。然后,所有代码都停止执行,应用程序暂停"暂停"。
如果您的应用提供GPS跟踪,音频播放等功能,那么您可以请求Apple允许其在后台保持活动状态。如果它没有提供上述或类似的东西 - 那么你的应用程序将只在背景中生活一个非常不确定的短时间,因此,检测屏幕状态可能是徒劳的。