2015-09-21 11 views
6

Chciałbym mieć monitor swojej aplikacji, gdy telefon zostanie zablokowany i odblokowany, a także gdy stanie się pusty (po dłuższej nieaktywności), wszystko to, gdy moja aplikacja nie jest skupiona, ale działa w tle.Jak słuchać zdarzenia telefonu blokującego/odblokowującego, gdy aplikacja działa w tle?

mogę otrzymać zablokować/odblokować/pusty wydarzenia z łatwością, podczas gdy aplikacja koncentruje się:

-(void) startListeningForPhoneLockEvent 
{ 
    NSLog(@"Start listening to lock/unlock and screen-goes-black events."); 

    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), 
           (void*)self, 
           lockStateChanged, 
           CFSTR("com.apple.springboard.lockstate"), 
           NULL, 
           CFNotificationSuspensionBehaviorDeliverImmediately); 

    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), 
           (void*)self, 
           hasBlankedScreen, 
           CFSTR("com.apple.springboard.hasBlankedScreen"), 
           NULL, 
           CFNotificationSuspensionBehaviorDeliverImmediately); 
} 

i oddzwanianie funkcje:

static void lockStateChanged(CFNotificationCenterRef center, void*observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) 
{ 
    NSLog(@"Lock event received!"); 
} 

static void hasBlankedScreen(CFNotificationCenterRef center, void*observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) 
{ 
    NSLog(@"Blanked screen event received!"); 
} 

mam włączony tryb tła:

  • Pobieranie w tle.

Jednak gdy aplikacja przejdzie do tła, nie otrzyma zdarzeń blokowania/odblokowania/pustego ekranu.

Próbowałem już z innymi trybami tła, takimi jak odtwarzanie dźwięku, aktualizacje lokalizacji itp., Ale aplikacja nadal nie odbiera zdarzeń blokowania/odblokowania/pustego ekranu w tle.

Nie jestem pewien, czy jest to rzeczywiście możliwe, czy też robię coś nie tak.

Testuję to na prawdziwym urządzeniu, które jest aktualizowane do iOS9, przy użyciu najnowszego XCode z iOS9 SDK.

+0

Nie miałbym nic przeciwko rozwiązaniu w Swift. –

+0

Włączenie trybu tła w aplikacji nie pomaga, aplikacja powinna działać w tle. Czy możesz potwierdzić, że aplikacja działa w tle po zablokowaniu/odblokowaniu telefonu? – user3334059

+0

@SumantHanumante, czy są jakieś ograniczenia ze strony Apple w czasie pracy w tle, słuchania blokady, odblokowywania wydarzeń? –

Odpowiedz

-1

Mimo że Twoja aplikacja jest skonfigurowana do działania w tle, nie uruchomi się, jeśli nie ma jeszcze żadnej pracy. Aby go uruchomić w tle z aktualizacji lokalizacji, wykonaj these instructions by Ricky:

  1. ja ponownie uruchomić lokalizacjami co 1 minutę w funkcji didUpdateLocations.
  2. Pozwolę kierownikowi lokalizacji na pobranie lokalizacji z urządzenia na 10 sekund przed zamknięciem (aby oszczędzić baterię).

Częściowa poniższy kod:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ 

for(int i=0;i<locations.count;i++){ 
    CLLocation * newLocation = [locations objectAtIndex:i]; 
    CLLocationCoordinate2D theLocation = newLocation.coordinate; 
    CLLocationAccuracy theAccuracy = newLocation.horizontalAccuracy; 
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 

    if (locationAge > 30.0) 
     continue; 

    //Select only valid location and also location with good accuracy 
    if(newLocation!=nil&&theAccuracy>0 
     &&theAccuracy<2000 
     &&(!(theLocation.latitude==0.0&&theLocation.longitude==0.0))){ 
     self.myLastLocation = theLocation; 
     self.myLastLocationAccuracy= theAccuracy; 
     NSMutableDictionary * dict = [[NSMutableDictionary alloc]init]; 
     [dict setObject:[NSNumber numberWithFloat:theLocation.latitude] forKey:@"latitude"]; 
     [dict setObject:[NSNumber numberWithFloat:theLocation.longitude] forKey:@"longitude"]; 
     [dict setObject:[NSNumber numberWithFloat:theAccuracy] forKey:@"theAccuracy"]; 
     //Add the vallid location with good accuracy into an array 
     //Every 1 minute, I will select the best location based on accuracy and send to server 
     [self.shareModel.myLocationArray addObject:dict]; 
    } 
} 

//If the timer still valid, return it (Will not run the code below) 
if (self.shareModel.timer) 
    return; 

self.shareModel.bgTask = [BackgroundTaskManager sharedBackgroundTaskManager]; 
[self.shareModel.bgTask beginNewBackgroundTask]; 

//Restart the locationMaanger after 1 minute 
self.shareModel.timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self 
                 selector:@selector(restartLocationUpdates) 
                 userInfo:nil 
                 repeats:NO]; 

//Will only stop the locationManager after 10 seconds, so that we can get some accurate locations 
//The location manager will only operate for 10 seconds to save battery 
NSTimer * delay10Seconds; 
delay10Seconds = [NSTimer scheduledTimerWithTimeInterval:10 target:self 
               selector:@selector(stopLocationDelayBy10Seconds) 
               userInfo:nil 
               repeats:NO]; 
} 

byłem w stanie wykorzystać swój kod w projekcie github odwołuje się tam do słuchania zamka i odblokować wydarzenia na urządzeniu z systemem iOS 9, używając najnowszy XCode. Oto dzienniki:

2015-12-18 13:31:44.777 Location[16185:3796448] startLocationTracking 
2015-12-18 13:31:44.780 Location[16185:3796448] authorizationStatus authorized 
2015-12-18 13:31:44.788 Location[16185:3796448] Start listening to lock/unlock and screen-goes-black events. 
2015-12-18 13:31:44.834 Location[16185:3796448] locationManager didUpdateLocations 
2015-12-18 13:31:44.837 Location[16185:3796448] started master task 1 
2015-12-18 13:31:45.197 Location[16185:3796448] locationManager didUpdateLocations 
2015-12-18 13:31:48.079 Location[16185:3796448] Blanked screen event received! 
2015-12-18 13:31:48.215 Location[16185:3796448] Lock event received!
+0

Czy ktoś może wyjaśnić, dlaczego ta odpowiedź została odrzucona? Próbowałem dodać komentarz i powiedziałem, że nie mam wystarczająco dużo karmy i mogę tylko dodać odpowiedź – user3272750