2013-10-25 10 views
11

Ich muss etwas in applicationDidEnterBackground tun. Aber ich muss unterscheiden, welche Benutzeraktion den "Hintergrund eingeben" verursacht: Bildschirmsperre oder Home-Taste drücken.Unterscheiden zwischen Bildschirmsperre und Home-Taste drücken Sie auf iOS7

ich diesen Code wurde mit, die sich aus dieser post - How to differentiate between screen lock and home button press on iOS5? ist:

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"); 
} 

Es funktioniert auf iOS6 in Ordnung. aber auf iOS7 (sowohl Gerät und Simulator), bekomme ich immer UIApplicationStateBackground, ob der Benutzer auf den Home- oder den Lock-Button klickt.

Hat jemand eine Idee darüber, was das verursachen könnte? iOS 7 Updates für Multi-Task-Hintergrundverarbeitung? Oder eine Einstellung meiner App (der Hintergrundmodus meiner App ist deaktiviert)?

Und gibt es eine alternative Lösung?

+0

möglich duplikat von [Wie unterscheidet man zwischen Bildschirmlok k und Home-Taste drücken auf iOS5?] (http://stackoverflow.com/questions/8303703/how-to-differentiate-bird-screen-lock-and-home-button-press-on-ios5) – jmort253

+0

Ich denke, ich habe es nicht deutlich genug gesagt. Ich habe den Post auf deinem Link gelesen, aber das funktioniert nicht mehr in iOS7. Ich glaube nicht, dass es ein Duplikat ist. Aber wie auch immer, ich bearbeite meine Frage, um es klarzustellen. – Perisheroy

+0

Gute Idee, um zu klären, und die Bearbeitung stößt Ihren Beitrag zurück an die Spitze, damit andere es wieder sehen. : D – jmort253

Antwort

17

Dies kann Ihnen beiden auf iOS6 & iOS7 :) helfen.

Wenn Benutzer die Sperrtaste drücken, erhalten Sie eine com.apple.springboard.lockcomplete Benachrichtigung.

//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

Wenn Sie eine doppelte Frage finden, ist die richtige Aktion, sobald Sie 15 Wiederholungen haben, den Beitrag als Duplikat zu markieren. Einfach die gleiche Copy/Paste-Antwort auf der Website zu posten ist nicht das, worum es uns geht, und das erzeugt Lärm. – jmort253

+0

@ jmort253 Tut mir leid, ich weiß nicht, dass ich das tun sollte. Ich bin ein neuer Benutzer, aber meine Antwort ist richtig, denke ich. – wqq

+0

funktioniert nicht für mich. Testen Sie es auf iOS 7 (Simulator und Gerät). Ich glaube nicht, dass dies der richtige Weg ist, um [[UIScreen mainScreen] Helligkeit] zu verwenden.Laut Apple Library-Dokumenten ist es nur eine Einstellung für die Bildschirmhelligkeit in dieser App, nicht die aktuelle Bildschirmhelligkeit. – Perisheroy

0

Es ist nicht in Swift funktioniert, müssen Sie einige Änderungen tun, um es in Swift funktioniert wie

folgen

1.Erstellen ein objectC-Datei mit dem Namen LockNotifierCallback.m wie folgt:

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 

einen Kopf schaffen sowie: #import

@interface LockNotifierCallback : NSObject 


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


@end 

2.bridge diese Datei zu schnellen

3.Add Funktion APPdelegate.swift:

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

PS: UIApplicationState funktioniert hier nicht einwandfrei

Verwandte Themen