2013-10-25 12 views
11

Potrzebuję zrobić coś w applicationDidEnterBackground. Ale muszę rozróżnić, które działanie użytkownika powoduje "wejście w tle": blokada ekranu lub naciśnięcie przycisku głównego.Rozróżnianie blokady ekranu i naciśnięcia przycisku głównego na iOS7

używałem ten kod, który jest z tego 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"); 
} 

Działa dobrze na iOS6. ale na iOS7 (zarówno urządzenie, jak i symulator) zawsze otrzymuję UIApplicationStateBackground, niezależnie od tego, czy użytkownik kliknie przycisk home lub przycisk blokady.

Czy ktoś ma pojęcie o tym, co może spowodować? Aktualizacje iOS 7 do obsługi wielu zadań w tle? Lub niektóre ustawienia mojej aplikacji (tryb tła mojej aplikacji jest wyłączony)?

A czy istnieje alternatywne rozwiązanie?

+0

możliwy duplikat [Jak odróżnić lokalizację ekranu k i przycisk home nacisnąć na iOS5?] (http://stackoverflow.com/questions/8303703/how-to-differentiate-between-screen-lock-and-home-button-press-on-ios5) – jmort253

+0

Myślę, że ja nie określiłem tego wystarczająco jasno. Czytam wpis na Twoim linku, ale to już nie działa w iOS7. Nie sądzę, że to duplikat. Ale w każdym razie, edytuję moje pytanie, aby było jasne. – Perisheroy

+0

Dobry pomysł, aby wyjaśnić, plus edycja uderza swój post z powrotem na szczyt, aby inni zobaczą go ponownie. : D – jmort253

Odpowiedz

17

To może pomóc zarówno na iOS6 & iOS7 :).

Po naciśnięciu przycisku blokady użytkownika otrzymasz powiadomienie 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

Jeśli znajdziesz duplikat pytania, prawidłową akcją, gdy masz 15 powtórzeń, jest oznaczenie postu jako duplikatu. Po prostu umieszczenie tej samej odpowiedzi na kopiuj/wklej na stronie nie jest tym, o co nam chodzi, a to powoduje hałas. – jmort253

+0

@ jmort253 Przepraszam, nie wiem, że powinienem to zrobić. Jestem nowym użytkownikiem, ale moja odpowiedź jest słuszna. – wqq

+0

nie działa dla mnie. przetestuj go na iOS 7 (symulator i urządzenie). Nie sądzę, że jest to właściwy sposób używania jasności [[UIScreen mainScreen]].Zgodnie z dokumentami biblioteki Apple, jest to po prostu ustawienie jasności ekranu w tej aplikacji, nie jest konieczne aktualny poziom jasności ekranu. – Perisheroy

0

To nie działa w Swift, trzeba zrobić kilka modyfikacji, aby pracować w Swift jak postępować

1.Create A plik obiektywu o nazwie LockNotifierCallback.m, jak następuje:

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 

stworzyć głowicę, a także: #import

@interface LockNotifierCallback : NSObject 


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


@end 

2.bridge ten plik do szybkiego

funkcji 3.Add do APPdelegate.swift:

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

PS: UIApplicationState nie działa tutaj idealnie

Powiązane problemy