2013-10-25 2 views
11

Мне нужно что-то сделать в applicationDidEnterBackground. Но мне нужно различать, какое действие пользователя вызывает «ввести фон»: блокировка экрана или кнопка «домой».Дифференциация между блокировкой экрана и нажатием кнопки дома на iOS7

Я использую этот код, который от этого post - How to differentiate between screen lock and home button press on iOS5?:

UIApplicationState state = [application applicationState]; 
if (state == UIApplicationStateInactive) { 
    NSLog(@"Sent to background by locking screen"); 
} else if (state == UIApplicationStateBackground) { 
    NSLog(@"Sent to background by home button/switching to other app"); 
} 

Он отлично работает на iOS6. но на iOS7 (как на устройстве, так и на симуляторе) я всегда получаю UIApplicationStateBackground, будет ли пользователь нажимать кнопку «Дом» или кнопку блокировки.

Есть ли у кого-нибудь идеи о том, что может вызвать это? Обновления iOS 7 для обработки нескольких задач? Или некоторые настройки моего приложения (фоновый режим моего приложения отключен)?

И есть ли альтернативное решение?

+0

Возможный дубликат [Как различать расположение экрана k и home нажимают на iOS5?] (http://stackoverflow.com/questions/8303703/how-to-differentiate-between-screen-lock-and-home-button-press-on-ios5) – jmort253

+0

Я думаю, что я не констатировал это достаточно четко. Я прочитал сообщение в вашей ссылке, но это больше не работает в iOS7. Я не думаю, что это дубликат. Но в любом случае, я редактирую свой вопрос, чтобы дать понять. – Perisheroy

+0

Хорошая идея, чтобы уточнить, плюс редактирование ударяет ваш пост назад, чтобы другие видели его снова. : D – jmort253

ответ

17

Это может помочь вам обоим на iOS6 & iOS7 :).

Когда пользователь нажмет кнопку блокировки, вы получите уведомление com.apple.springboard.lockcomplete.

//new way 
//put this in - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), 
            NULL, 
            displayStatusChanged, 
            CFSTR("com.apple.springboard.lockcomplete"), 
            NULL, 
            CFNotificationSuspensionBehaviorDeliverImmediately); 

//put this function in AppDelegate 
static void displayStatusChanged(CFNotificationCenterRef center, 
           void *observer, 
           CFStringRef name, 
           const void *object, 
           CFDictionaryRef userInfo) { 
    if (name == CFSTR("com.apple.springboard.lockcomplete")) { 
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"kDisplayStatusLocked"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
} 

//put this in onAppEnterBackground 
UIApplicationState state = [[UIApplication sharedApplication] applicationState]; 
    if (state == UIApplicationStateInactive) { 
     NSLog(@"Sent to background by locking screen"); 
    } else if (state == UIApplicationStateBackground) { 
     if (![[NSUserDefaults standardUserDefaults] boolForKey:@"kDisplayStatusLocked"]) { 
      NSLog(@"Sent to background by home button/switching to other app"); 
     } else { 
      NSLog(@"Sent to background by locking screen"); 
     } 
    } 

//put this in - (void)applicationWillEnterForeground:(UIApplication *)application 
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"kDisplayStatusLocked"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

CGFloat screenBrightness = [[UIScreen mainScreen] brightness]; 

NSLog(@"Screen brightness: %f", screenBrightness); 

UIApplicationState state = [[UIApplication sharedApplication] applicationState]; 

if (state == UIApplicationStateInactive) { 

    NSLog(@"Sent to background by locking screen"); 

} else if (state == UIApplicationStateBackground) { 
    if (screenBrightness > 0.0) { 
     NSLog(@"Sent to background by home button/switching to other app"); 
    } else { 
     NSLog(@"Sent to background by locking screen"); 
    } 
} 

+2

Если вы обнаружили дублирующийся вопрос, правильное действие после того, как у вас есть 15 rep, должно обозначить пост как дубликат. Просто публиковать те же ответы на копирование и вставку по сайту - это не то, о чем мы говорим, и это создает шум. – jmort253

+0

@ jmort253 Извините, я не знаю, что я должен сделать вот так. Я новый пользователь, но мой ответ правильный, я думаю. – wqq

+0

не работает для меня. протестируйте его на iOS 7 (симулятор и устройство). Я не думаю, что это правильный способ использования яркости [[UIScreen mainScreen]].Согласно документам библиотеки Apple, это просто настройка яркости экрана в этом приложении, а не необходимый текущий уровень яркости экрана. – Perisheroy

0

Это не работает в Swift, что вам нужно сделать некоторые изменения, чтобы заставить его работать в Swift, как следовать

1.Create A objectC файл с именем LockNotifierCallback.m следующим образом:

static void displayStatusChanged(CFNotificationCenterRef center, 
           void *observer, 
           CFStringRef name, 
           const void *object, 
           CFDictionaryRef userInfo) { 
    if ([(__bridge NSString *)name isEqual: @"com.apple.springboard.lockcomplete"]) { 
     NSLog(@"Screen Locked"); 
     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"kDisplayStatusLocked"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
} 

@implementation LockNotifierCallback 

+ (void(*)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo))notifierProc { 
return displayStatusChanged; 
} 

@end 

создать голову, а также: #import

@interface LockNotifierCallback : NSObject 


+ (void(*)(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo))notifierProc; 


@end 

2.bridge этот файл быстрой

функции 3.Add в APPdelegate.swift:

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), nil, LockNotifierCallback.notifierProc(), "com.apple.springboard.lockcomplete", nil, CFNotificationSuspensionBehavior.DeliverImmediately) 

PS: UIApplicationState здесь не работает

Смежные вопросы