2015-12-15 13 views
5

Zgodnie z dokumentacją Apple mogę zarejestrować się w celu wymuszenia powiadomienia, dodając wartość kluczową "content-available" = 1 w słowniku ładowności . Chcę, aby moja aplikacja budziła się w tle po otrzymaniu cichego powiadomienia. Ustawić App downloads content in response to push notifications wartość Required background modes w moim Info.plistCzy ciche powiadomienia push firmy Apple uruchamiają moją aplikację w tle?

To mój słownik ładowność

{"aps": 
     { 
     "alert":"Notification alert","badge":1,"sound":"default","content-available":1 
     } 
} 

jestem coraz zwrotnych w -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler podczas gdy moja aplikacja jest w tle. Ale moje pytanie brzmi: czy możemy uzyskać wywołanie zwrotne do tej lub jakiejkolwiek innej metody, gdy nasza aplikacja jest w stanie uśmiercenia?

Nie chcę, aby użytkownik aplikacji zobaczył powiadomienie, ale chcę, aby moja aplikacja wykonywała określone zadanie, budząc je w tle za pomocą cichych powiadomień.

Wszelkie sugestie będą mile widziane.

Odpowiedz

4

Gdy urządzenie odbiera wiadomość Push z zestawem content-available, twoja aplikacja zostaje uruchomiona w tle przez Apple. Użytkownicy nie będą tego świadomi. From the docs:

treści dostępnych: Zapewnienie tego klucza o wartości 1 wskazuje, że nowa zawartość jest dostępna. Włączenie tego klucza i wartości oznacza, że ​​po uruchomieniu aplikacji w tle lub wznowione, -application:didReceiveRemoteNotification:fetchCompletionHandler: jest wywoływana.

+0

Masz rację, ale problem polega na tym, że moja aplikacja jest w stanie uśmiercenia i przychodzi ciche powiadomienie, niż moja aplikacja nie uruchamia się w tle. –

+0

Czy jesteś całkiem pewien? To może być trudne do debugowania. Może okazać się, że jest to najłatwiejsze (jeśli Twój Xcode debug-fu nie jest w 100%), aby zapisać dziennik do pliku po uruchomieniu aplikacji, dzięki czemu możesz zobaczyć, że aplikacja aktywuje się, nawet jeśli nie jesteś do niej podłączony za pomocą Debugger Xcode. Technologia zdecydowanie działa, ale [zdarzają się przypadkowe dziwactwa] (http://stackoverflow.com/questions/19239737/silent-push-notification-in-ios-ios-7-does-notwork). – TwoStraws

+1

Jeśli aplikacja została ręcznie usunięta przez użytkownika, często jest to wskazówką dla systemu operacyjnego, że użytkownik * naprawdę * nie chce, aby był uruchomiony. Z pewnością kilka innych "podstawowych" procesów w systemie iOS (np. Transfer plików w tle za pomocą NSURLSession) w szczególności * nie uruchamia aplikacji, tak jak normalnie, gdyby została zabita z przełącznika aplikacji.Nie wiem o tym konkretnym przypadku, ale nie zdziwiłoby mnie stwierdzenie, że ręcznie zakończona aplikacja nie obudzi się w powiadomieniach push, dopóki nie zostanie ręcznie uruchomiona ponownie przez użytkownika. –

4

Mam do czynienia z podobnym scenariuszem, napisałem ten kod do debugowania, jeśli moja aplikacja budzi się na cichej wiadomości, czy nie.

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *str = [defaults objectForKey:@"key"]; 
    if (str == nil) { 
     str = @"didReceiveRemoteNotification"; 
    }else{ 
     str = [NSString stringWithFormat:@"%@, didReceiveRemoteNotification",str]; 
    } 
    [defaults setObject:str forKey:@"key"]; 
    [defaults synchronize]; 
} 

Ten kod działa podobnie, jeśli aplikacja obudzi niż dostaniesz zwrotnego w tej metodzie i nazwa metody zostaną zapisane w NSUserDefaults. Tak więc podczas ręcznego debugowania aplikacji można sprawdzić wartość zmiennej łańcuchowej str, jeśli istnieje ciąg znaków didReceiveRemoteNotification, niż można się zorientować, że aplikacja się obudziła.

Uwaga: Działa to tylko dla mnie w tle. Dostaję wartość, gdy nie wymuszam zamknięcia (ręcznie) mojej aplikacji, ale kiedy wymuszam zamknięcie aplikacji z przełącznika aplikacji, nie otrzymam żadnej wartości.

Mam nadzieję, że działa.

Powiązane problemy