2012-05-10 14 views
7

Moje app został odrzucony przez Apple trzy razy, wszystkie z tą samą literą odrzucenia, która jest:Jak prawidłowo używać lokalizację w tle - aplikacja został odrzucony 3 razy

okazało się, że aplikacja korzysta z trybu tła ale nie obejmuje funkcji , która wymaga, aby tryb działał w sposób ciągły. To zachowanie nie jest zgodne z Wytycznymi oceny App Store.

Zauważyliśmy, że Twoja aplikacja deklaruje obsługę lokalizacji w kluczu UIBackgroundodes w pliku Info.plist, ale nie zawiera funkcji wymagających stałej lokalizacji.

Właściwe byłoby dodanie funkcji wymagających aktualizacji lokalizacji , gdy aplikacja jest w tle lub usunięcie ustawienia "lokalizacja" z klucza UIBackgroundModes.

Jeśli zdecydujesz się dodać funkcje, które używają trybu lokalizacja tło, prosimy dołączyć następującą akumulatora, zastrzeżenie w opisie Zastosowanie:

„Dalsze używanie GPS uruchomiony w tle można drastycznie zmniejszyć żywotność baterii . "

Informacje na temat trybów tła znajdują się w sekcji "Wykonanie kodu w tle" w bibliotece referencyjnej iOS.

Teraz, o ile wiem, że działa w tle i „robi coś” ... W moim AppDelegate Mam następujący kod w didFinishLaunchingWithOptions:

if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsLocationKey] && 
    ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])) 
{ 
    id locationInBackground = [launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]; 
    if ([locationInBackground isKindOfClass:[CLLocation class]]) 
    { 
     [self updateMyLocationToServer:locationInBackground]; 
    } 
    else 
    { 
     //Keep updating location if significant changes 
     CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 
     self.bgLocationManager = locationManager; 
     self.bgLocationManager.delegate = self; 
     self.bgLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; 
     [bgLocationManager startMonitoringSignificantLocationChanges]; 
    } 
} 

AppDelegate rozpoczyna również menedżer lokalizacji i staje się delegatem. Wtedy, mam następujący kod do obsługi aktualizacje lokalizacji w tle:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    [self updateMyLocationToServer:newLocation]; 
} 


-(void)updateMyLocationToServer:(CLLocation*)myNewLocation 
{ 
    // NSLog(@"Updating Location from the background"); 

    NSString *fbID = [NSString stringWithString:[facebookDetails objectForKey:@"fbID"]]; 
    NSString *firstName = [NSString stringWithString:[facebookDetails objectForKey:@"firstName"]]; 
    NSString *lastName = [NSString stringWithString:[facebookDetails objectForKey:@"lastName"]]; 

    NSString *urlString = [NSString stringWithFormat:@"MY_SERVER_API", fbID, myNewLocation.coordinate.latitude, myNewLocation.coordinate.longitude, firstName, lastName]; 


    NSURL *url = [NSURL URLWithString:urlString]; 

    __block ASIHTTPRequest *newRequest = [ASIHTTPRequest requestWithURL:url]; 

    [newRequest setCompletionBlock:^{ 


    }]; 

    [newRequest setFailedBlock:^{ 

    }]; 

    // [newRequest setDelegate:self]; 
    [newRequest startAsynchronous]; 
} 

ja również umieścić zastrzeżenie w moim app opis strony:

Intensywne używanie GPS uruchomiony w tle można radykalnie zmniejszyć żywotność baterii. Z tego powodu MY_APP_NAME działa w tle, po prostu słuchając znaczących zmian lokalizacji.

Czy czegoś tu brakuje?

+0

Czy "tryb tła" nie oznacza czegoś, co nadal działa po wyjściu użytkownika z aplikacji? – cgull

+0

@thephpdeveloper Dzięki za poinformowanie mnie. Będąc całkiem nowym użytkownikiem StackOverflow, nie wiedziałem o tym systemie. – Giovanni

+0

@cgull Nie jestem pewien. Mam na myśli, czy rejestracja lokalizacji nie jest wystarczająco dobra? Wtedy, gdy pojawi się nowa lokalizacja, moja aplikacja zostanie pobudzona do stanu aktywnego w tle, a następnie mam możliwość zrobienia czegoś, np. Zaloguj moją nową lokalizację na mój serwer. Tak właśnie myślałem ... – Giovanni

Odpowiedz

4

W menedżerze lokalizacji: didUpdateToLocation: fromLocation: lub w updateMyLocationToServer: Należy sprawdzić, czy aplikacja działa w tle, np.

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground 

A jeśli Twoja aplikacja działa w tle, powinieneś użyć np.

backgroundTask = [[UIApplication sharedApplication] 
        beginBackgroundTaskWithExpirationHandler: 
        ^{ 
         [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
        }]; 

/*Write Your internet request code here*/ 

if (bgTask != UIBackgroundTaskInvalid) 
{ 
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
    bgTask = UIBackgroundTaskInvalid; 
} 

W ten sposób aplikacja powinna wykonać to zadanie całkowicie.

+6

Czy twoja aplikacja została zaakceptowana przez dodanie tego kodu? – theDuncs

+1

Nie ma sensu próbować endBackgroundTask wewnątrz programu obsługi wygaśnięcia, został on już zakończony przez wygaśnięcie – malhal

+1

Słuchanie Komentarz @ malhal na własne ryzyko! Z dokumentacji Apple: * Powinieneś użyć tego programu do wyczyszczenia i oznaczenia końca zadania w tle. ** Niewykończenie zadania jawnie spowoduje zakończenie aplikacji. *** https://developer.apple.com/reference/uikit/uiapplication/1623031-beginbackgroundtask – mxcl

7

To pytanie jest stary i już odpowiedział, ale nie trzeba klucz UIBackgroundModes jeśli zebrać lokalizacje przy użyciu interfejsu API startMonitoringSignificantLocationChanges

+0

Mam takie samo odrzucenie jak podano powyżej, ale kiedy wyjmę Tryby UIBackground, mój startMonitoringSignificantLocationChanges nigdy nie zostanie wywołany i widzę strzałkę nawigacji na pasku systemowym znikają. jakieś pomysły? –

+0

Sugeruję, abyś zadał nowe pytanie ze wszystkimi szczegółami tego, co robisz i przykładami kodu. Zakres jest zbyt szeroki dla komentarza 500-znakowego. Jeśli zamieścisz tutaj swój link do pytania, przyjrzę się temu. To powinno działać dla ciebie. Mi to pasuje. – jackslash

1

startMonitoringSignificantLocationChanges nie wymagają rejestracji trybu tła. Zmieniają się tylko ciągłe zmiany lokalizacji.

+0

Dlaczego podałeś dokładnie tę samą odpowiedź ponownie (http://stackoverflow.com/questions/12690459/apple-rejection-because-uibackgroundmode-location), proszę odwołaj się do odpowiedzi, nie rób bezpośrednio kopii. Komentarze pozostają z innej odpowiedzi. To nie jest tak naprawdę odpowiedź, a ta sprawa nawet nie odpowiada na pytanie -1 – Popeye

Powiązane problemy