2014-05-07 8 views
7

W przypadku iOS7 możliwe jest posiadanie completionHandler dla Zdalnych powiadomień. Czy jest to możliwe w przypadku UILocalNotifications?Praca z UILocalNotifications, Zdalne powiadomienia z obsługą zakończenia i Pobieranie w tle

Zasadniczo chcę, aby usługa internetowa publikowała moje dane w regularnych odstępach czasu równych 30 sekund, nawet jeśli aplikacja działa w tle. W tym uznałem 3 opcje, ale nie dostać pomocy z dowolnego:

  1. Tło Fetch: To będzie działać w tle, ale nie mogę go używać, ponieważ nie jest obowiązkowe, które zawsze będą wywoływać iOS to tło pobierać w żądanych przedziałach czasu.

  2. Zdalne powiadomienia: To działa idealnie. Ale co 30 sekund muszę wysłać zdalne powiadomienie PUSH, które nie jest w ogóle praktyczne. Również będzie świetnie, gdybym mógł poradzić sobie z tym lokalnie.

  3. UILocalNotification: Nie ma do tego obsługi zakończenia. Użytkownik BĘDZIE MÓGŁ otworzyć aplikację. Więc to nie działa tak dobrze!

Czy są jeszcze jakieś opcje? Czy nawet w przypadku iOS7 nadal nie można zrobić czegoś lokalnego w tle?

Proszę o pomoc. Dzięki!

+0

Dlaczego trzeba wysłać informacje do serwera tak często, jeśli użytkownik nie patrząc nawet w swojej aplikacji? – Rivera

+0

@Rivera to coś, co użytkownik rozpocznie nagrywanie i powinno kontynuować, nawet jeśli aplikacja działa w tle. zatrzymuje się tylko wtedy, gdy użytkownik je zatrzyma. dziwne wymaganie, wiem! ale tego właśnie wymagam do zbudowania! – mayuur

+0

Nagrywanie czego? Może możesz nagrywać lokalnie? Apple sprawdzi, ile zużywa Twoja aplikacja i dostosowuje częstotliwość, z jaką wywołuje metodę tła, dzięki czemu lepiej będzie "eko", nie wysyłając jeszcze danych na serwer. – Rivera

Odpowiedz

5

Zasłoniłeś wszystkie opcje i jak widzisz, nie jest to obsługiwane. Z ważnych powodów, głównie, że budzenie aplikacji w tle jest kosztowną operacją (w systemie iOS7 migawka jest pobierana po zakończeniu pracy w tle), robienie tego co 30 sekund byłoby niszczycielskie dla żywotności baterii.

Widząc, że nie wspomniałeś o danych, które musisz opublikować, w większości przypadków proponuję przeprojektować aplikację tak, aby była przyjazna dla baterii użytkowników. Jeśli potrzebujesz raportowania lokalizacji, zamiast słuchać znaczących zmian lokalizacji, zamiast nagrywać co 30 sekund.

Nadużycie powiadomień push jest możliwe (zwróć uwagę, że ciche powiadomienia zdalne są ograniczone przez Apple), ale zastanów się, jakie będą wrażenia użytkowników.

Jeśli uważasz, że ta funkcja powinna tam być i jej brakuje, powinieneś otworzyć prośbę o ulepszenie z Apple i opublikować tutaj numer radaru, aby ludzie mogli go powielić.

2

Pobieranie w tle jest bezpośrednią odpowiedzią na Twój problem. Pobieranie w tle rozpoczyna procedurę pobierania, gdy system iOS może okresowo wykonywać zadanie. Wszystko, co musisz zrobić, to zainicjować Ci NSURLSession wniosek w

- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler 

NSURLConnection nie jest już ważny API dla zgłoszeń serwisowych lub nie obsługuje tła stawianie zadań. NSURLSession jest wyraźnie zastępczym API dla NSURLConnection z jego zaawansowanymi funkcjami iOS 7.Dodawanie poniżej dokumentacji z dokumentacją Apple iOS

NSURLSession is a replacement API for NSURLConnection. It provides 
options that affect the policy of, and various aspects of the 
mechanism by which NSURLRequest objects are retrieved from the 
network. 

Tło sprowadzić przedział może być ustawiony, aby określić częstotliwość powtarzania na tle pobierał, ale również uważa czynniki zasobów systemu operacyjnego i operacji oczekujących

- (void)setMinimumBackgroundFetchInterval:(NSTimeInterval)minimumBackgroundFetchInterval; 

iOS 7 wyraźnie daje lepszy sposób na aktualizację zawartości aplikacji, ale respektuje ona priorytet użytkowników urządzenia, tak jak iOS ogólnie. Mam nadzieję, że to odpowiada na twoje pytanie.

1

Wygląda na to, że nie można komunikować się z serwisem internetowym w regularnych odstępach czasu od tła.

UILocalNotifications lub Remote Messions wymaga działania użytkownika, aby obudzić aplikację, jeśli jest w tle. edycja: Począwszy od iOS 7.0 zdalne powiadamianie może obudzić aplikację, ale nie jest to elastyczne rozwiązanie

iOS umożliwia kolejne działania w tle dla aplikacji, które korzystają z jednego z podanych UIBackgroundModes, zobacz proszę „Tabela 3-4 tryby tło dla aplikacje ":

Here is a link to related Apple docs

Jeśli aplikacja nie jest umieszczony na jednym z trybów bezpośrednio bg, zgadzam się z Anil Kumar (post powyżej), że tło pobrania jest najbardziej przydatna rzecz tutaj. Jednak nie robi całkowicie tego, czego potrzebujesz. [UIApplication setMinimumBackgroundFetchInterval:] nie oznacza żadnego ścisłego czasu. Oznacza to jedynie minimalny interwał (lub pożądany czas). Tutaj jest więcej info:

performFetchWithCompletionHandler never gets fired

Dzięki

+1

Jeśli chodzi o zdalne powiadomienia, to jest niepoprawna. Jeśli użytkownik nie uśmiercił konkretnie aplikacji przy użyciu machnięcia w menedżerze zadań, powiadomienia zdalne mogą być używane do budzenia aplikacji w tle, pod warunkiem, że ładunek wypychany dociera w prawidłowych odstępach czasu. Ale to zły pomysł. –

+0

@LeoNatan Uzgodnione, począwszy od iOS 7.0 zdalne powiadomienie może obudzić aplikację. Dzięki za wytłumaczenie. –