2011-06-05 16 views
12

Chciałbym, aby moja aplikacja mogła - powiedzmy, co 12 godzin - nawet jeśli aplikacja nie działa obecnie lub jest w tle, wysłać żądanie HTTP do serwera, uzyskać mały plik z numerem wersji i jeśli wersja na serwerze jest wyższa niż wersja na kliencie, a następnie pobierz więcej plików na dysk, aby przy następnym uruchomieniu aplikacji znajdzie nową zawartość na dysku.Czasowe przetwarzanie w tle iOS

Jakie wzorce najlepiej pasują do tego zadania w iOS?

Kilka przychodzi mi na myśl, ale nie jestem tak doświadczony.

  1. Być może powiadomienia push, serwer musi wysłać wiadomość do wszystkich klientów, gdy dostępna jest nowa wersja.
  2. Czy jest coś podobnego do Androida Service, które może pomóc?
  3. A może za każdym razem, gdy aplikacja się uruchamia (lub wychodzi na pierwszy plan), po prostu pinguj serwer i sprawdź, czy jest coś nowego.
  4. Lub za każdym razem, gdy aplikacja zacznie pingować serwer i dodać zegar przez następne 12 godzin, jeśli ta aplikacja będzie nadal na pierwszym planie.
  5. Lub za każdym razem, gdy aplikacja się uruchamia, sprawdź wartość preferencji, a jeśli ostatnio serwer był pingowany było więcej niż 12 godzin temu, a następnie ping teraz. A następnie zapisz ten czas pingowania.

Opcja 1 może być bardziej obciążona na serwerze i może być bardziej skomplikowana w implementacji (należy rozważyć ios newbe), ale może być jedyną opcją do aktualizacji w tle. Ale mimo wszystko, nadal nie chcę, aby użytkownik musiał reagować na jakiś niski poziom aktualizacji b/wa klienta i serwera (i to jest to, co jest), więc jeśli powiadomienia push nie mogą przejść bezpośrednio do aplikacji i wykonać coś bez interwencji użytkownika, ta opcja nie lata.
Opcje 3-5 są możliwe i nie brzmią zbyt mocno, ale działałyby tylko wtedy, gdy aplikacja znajduje się na pierwszym planie.

Z tego, co wiem, aplikacje działające w tle mogą odtwarzać muzykę, otrzymywać aktualizacje lokalizacji lub aktualizacje VoIP. Jest nawet this hack z cichym dźwiękiem, który próbował uciec przed tym ograniczeniem. (i nie został zatwierdzony do sklepu).

Być może ograniczenia na miejscu są słuszne, więc w jaki sposób mogę grać według reguł i być w stanie osiągnąć okresowe pingowanie serwera (lub, bardziej ogólnie, rozwiązać problem okresowej synchronizacji b/w klientów i serwerów, nawet gdy aplikacje są w bg)?

Dzięki

+0

Proponuję 4 lub 5. Aplikacja może nic zrobić, że chce w tle, ale tylko przez 10 minut. Powiadomienia push mogą uruchamiać kod tylko wtedy, gdy wyświetlają komunikat, a użytkownik decyduje się je otworzyć. – ughoavgfhw

Odpowiedz

2

najwygodniejszym wiadomość byłoby powiadomić użytkownika o aktualizacji z powiadomień Push i kiedy aplikacja uruchamia to może pokazać jakieś „aktualizacji ..” ekranu.

Jedną z głównych koncepcji projektowych w ramach iOs jest to, że aplikacja robi to, o co prosi użytkownika. więc jeśli masz aktualizacje wymagające dużej ilości danych, które musisz zainstalować, powiadomień push & update-dialog to sposób, w jaki powinieneś pójść. Jeśli twoje aktualizacje są bardzo częste (pisałeś o 12h-czekach -> zakładając, że cykl aktualizacji 24-48h), możesz chcieć załadować nowe dane za każdym razem, gdy uruchomi się aplikacja. Przyjazne dla iPada jest tego dobrym przykładem - ładują tony html/javascript/css do wykorzystania jako ramy do wyświetlania zawartości Facebooka w WebView, ponieważ struktury Facebooka zmieniają się szybko.

5

Nie mam jednoznacznej odpowiedzi na twoje pytanie, tylko obszerny zestaw komentarzy, które mogą pomóc ci zdecydować, co będzie najlepsze dla twojej sytuacji. Przepraszam, to jest najlepsze, co mogę zaoferować.

Należy pamiętać, że aplikacja nie powinna wykorzystywać żadnego z abonamentów telefonu, nie informując użytkownika, że ​​coś pobiera. Niektóre aplikacje pobierają rzeczy, takie jak klienci Twittera, więc natura aplikacji informuje użytkownika, że ​​aplikacja korzysta z abonamentu danych. Inne aplikacje, takie jak program do rysowania, nie mają wyraźnej potrzeby pobierania, więc powinny powiadomić użytkownika o potrzebie pobrania.

Ponieważ Apple nie zezwala programistom na pobieranie w tle, osoby korzystające z systemu iOS są przeszkolone w zakresie oczekiwania na pobieranie przez aplikacje zaktualizowanych danych. Typowy sposób na poprawę komfortu użytkownika podczas oczekiwania na pobranie to pokazanie co najmniej spinnera, informując użytkownika, że ​​aplikacja działa. Aby jeszcze bardziej ulepszyć interfejs, prześlij pobrany plik do innego wątku i pozwól innym użytkownikom dalej korzystać z pozostałej części aplikacji. Mogą wchodzić w interakcje ze starymi danymi lub korzystać z części aplikacji, które nie wymagają aktualizacji.

Apple nie daje programistom mechanizmu pobierania nowej treści w tle dla większości typów aplikacji. Zgodnie z zapowiedziami Apple, funkcja Kiosk na iOS 5 pozwoli na aktualizację subskrypcji w tle. Być może w przyszłości programiści będą mieli więcej opcji pobierania w tle.

Mam jedną aplikację w App Store, która wykorzystuje metody 5, a drugi w pracach, które wykorzystuje metodę 3.

użyję powiadomień push (metoda 1) jeśli ludzie chcą wiedzieć, jak szybko w miarę możliwości, że dostępne są nowe dane. To zależy od tematu.

iOS nie ma czegoś takiego serwisu Android (metoda 2)

Mam app, który sprawdza kanał RSS nowości każdym razem, gdy aplikacja jest uruchomiona (metoda 3). Ta aplikacja robi głównie inne rzeczy, ale pokazuje kanał w widoku początkowym. Ponieważ aplikacja jest prostym narzędziem, które pomaga ludziom znaleźć konkretne rozwiązanie, kanał RSS ma charakter pomocniczy.

Podoba mi się pomysł zegara w metodzie 4. Jeśli chcesz dać osobie szansę zatwierdzenia pobierania, licznik może wyświetlić widok alertu, a następnie czekać. W ten sposób aplikacja faktycznie nie pobiera czegoś, jeśli urządzenie zostało właśnie pozostawione z aplikacją na pierwszym planie.

Moja implementacja metody 5 w mojej obecnie dostępnej aplikacji jest nieco zmieniona. Pobiera dane dla jednego z wielu widoków. Za każdym razem, gdy ten widok jest odwiedzany, sprawdza on względem przechowywanego czasu, czy nie powinien pobierać nowych danych. Następnie prosi o pozwolenie.

3

Być może ograniczenia w miejscu są dobrej sprawy, więc jak mam grać zgodnie z zasadami i być w stanie osiągnąć okresowe ping serwera (lub więcej generalnie rozwiązać problem okresowej synchronizacji b/w klientów i serwery nawet gdy aplikacje są w bg)?

Dowolna z opcji 3, 4 lub 5 to właściwa droga.

Aplikacje iOS zazwyczaj nie tworzą nawet swoich widoków, dopóki nie są potrzebne w celu oszczędzania zasobów, więc zdecydowanie nie ma sensu włączać radia i pobierać danych, których użytkownik nigdy nie zobaczy.

Jeśli bardzo ważne jest, aby użytkownik korzystał z najbardziej aktualnych danych w celu korzystania z aplikacji (wydaje się mało prawdopodobne, jeśli aktualizujesz tylko dwa razy dziennie), zaprojektuj aplikację w taki sposób, aby użytkownik albo nie będzie widzieć starych danych, albo wie, że dane są aktualizowane.Powiedzmy, że twoja aplikacja to kalkulator hipoteczny, który musi wiedzieć, jakie są obecnie dostępne stopy procentowe. Możesz:

  • Take wejściowe użytkownika, ale nie wyświetla wynik, dopóki masz pewność, że dane są aktualne (lub pobrać nowe dane).

  • Wprowadź dane użytkownika i wyświetl wynik, korzystając z posiadanych danych, ale pokaż wynik w taki sposób, aby wynik mógł się zmienić. Może to oznaczać wyświetlenie pokrętła w pobliżu liczb, które mogą ulec zmianie lub może pokazywać wątpliwe liczby w innym kolorze.

  • Wyświetla komunikat "data last updated at: ..." gdzieś w pobliżu.

Użytkownicy zazwyczaj nie przeszkadza czeka kilka sekund aplikacji mobilnej zrobić jego rzecz, zwłaszcza, jeżeli: a) zrozumieć dlaczego opóźnienie się dzieje, oraz b) ich Urządzenie działa bardzo dobrze w innych aspektach , na przykład o znacznie dłuższej żywotności baterii niż inne urządzenia. Na przykład, ciągle jestem zaskoczony, jak długo mój iPad będzie działał, zanim potrzebuję doładowania; jeśli chodzi o kompromis, to muszę chwilę poczekać, aż aplikacje trafią do sieci, nie mam nic przeciwko temu.

0

Chciałbym dodać voip ciąg w tle w pliku Info.plist. Następnie możesz zadzwonić pod numer setKeepAliveTimeout:handler:, który umożliwia okresowe uruchamianie zaplanowanego zadania. Pamiętaj, że zużyje więcej baterii.

Więcej informacji: http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH5-SW15

+7

Wdrożenie łańcucha w tle w trybie voip w celu zrobienia czegoś innego niż voip prawdopodobnie nie tylko spowodowałoby odrzucenie aplikacji ze sklepu, ale także zamknięcie konta programisty. –