iPhone aplikacja offline z synchronizacją

Zastanawiam się nad zbudowaniem aplikacji, która działa równie dobrze offline jak online. Ponieważ aplikacja nie może komunikować się z serwerem w trybie offline, istnieje pewien poziom synchronizacji, który musi się odbyć.

Jakie są dobre narzędzia do czytania i myślenia o planowaniu operacji offline z synchronizacją dla iPhone ' a?

Jakie narzędzia będę musiał tworzyć samodzielnie, a jakie narzędzia, które apple już oferuje, aby pomóc w ten konkretny problem?

Author: Jonas, 2009-03-27

6 answers

Istnieje wiele aplikacji w app store, które opierają się zarówno na danych online, jak i offline

To, co naprawdę powinieneś robić, to uruchamiać wątek w tle (który działa po cichu, aby użytkownik nigdy nie widział opóźnienia). ten wątek pobiera najnowsze dane z twojego serwera i wysyła je do lokalnej bazy danych (sqlite jest najlepszym wyborem)

Upewnij się, że zaimplementowałeś pewien rodzaj wersjonowania danych, aby Twoja aplikacja pobierała tylko dane, które są w rzeczywistości zmieniono od ostatniego pobrania-w przeciwnym razie niepotrzebnie pobierasz cały zestaw danych, który może być dość ogromny (w zależności od wymagań aplikacji)

Upewnij się również, aby przetestować łączność z Internetem podczas wykonywania tego zadania. jeśli nie ma internetu, Powiadom użytkownika na pewno

W ten sposób otrzymasz to, co najlepsze z obu światów. użytkownicy z dala od Internetu mogą nadal korzystać z aplikacji z lokalnymi danymi SQLite

W iphone os 3.0 apple wprowadziło usługi push-gdzie można po prostu "PUSH" Dane zamiast robić "PULL" jednak nie jest to dostępne w bieżącym iPhone OS (2.x. x)

 14
Author: Raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-27 12:34:04

Pracowałem nad aplikacją, która obsługuje to dokładnie zachowanie przez ostatnie 2 miesiące lub tak. Ma mały podzbiór funkcji, które są tylko online i duży zestaw funkcji, które jest offline / online.

Używam SQLite do przechowywania lokalnego, jak sugerowano tutaj ze zmodyfikowaną wersją biblioteki sqlitepersistentobjects. Podstawowa wersja sqlitepersistentobjects nie jest bezpieczna dla wątków, więc uważaj, jeśli go używasz. (sprawdź objectiverecord w: objectivesync dla thread safe alternative, ale bądź przygotowany na zagłębianie się w kod). Jeśli chcesz rozwijać dla sdk 3.0, core data jest kolejną możliwością dla biblioteki sqlite.

Ogólna architektura jest na tyle prosta, że modelowałem lokalną pamięć masową za pomocą sqlite i zdalną interakcję za pomocą objective resource przeciwko aplikacji rails i REST api. Może używać xml lub json do serializacji danych.

Gdy obiekt jest modyfikowany lokalnie, zmiana jest najpierw zapisywana w sqlite rekord bazy danych dla tego obiektu, a następnie dodany do kolejki, która jest serializowana i przechowywana w lokalnym SQLite db, jak również. (Kolejka może zostać przetworzona w dowolnym momencie)

Jeśli dostępne jest połączenie, wszelkie lokalne zmiany w kolejce są deserializowane i dodawane do zapytania NSOperationQueue, które następnie przetwarza je w tle.

Aby to wszystko działało, podklasowałem NSOperation, aby mógł obsługiwać kilka rodzajów zdalnych operacji kolejkowych-tworzenie , aktualizowanie, usuwanie zasadniczo korzystanie z obiektywnego zasobu do składania zdalnych żądań.

Fajną rzeczą w używaniu NSOperationQueue i NSOperation jest to, że zajmują się threadingiem w tle, więc gorąco polecam rzucić okiem na dokumenty apple dla tych klas, a także na apple threading guide.

Kiedy aplikacja się ładuje, w tle jest trochę zdalnego sprawdzania i przetwarzania w celu ściągnięcia najnowszych danych - chociaż szczerze mówiąc wciąż zmieniam sposób, w jaki to się trochę zachowuje.

To szybki przegląd tego, z czym miałem do czynienia do tej pory...mam nadzieję, że to trochę pomoże.

 16
Author: paulthenerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-13 21:03:27

Push prawdopodobnie nie jest realną opcją, ponieważ ilość danych, które możesz wypchnąć, jest znikoma i w zasadzie wraca do "powiedz mojej aplikacji, aby nawiązała połączenie z serwerem". Używamy modelu online / offline w Satchel. Ilekroć musimy komunikować się z serwerem, łączymy tę komunikację (URL i ewentualnie niektóre dane POST) i przechowujemy ją w bazie danych. Jeśli jesteśmy online, wyciągamy go z powrotem, wysyłamy, a kiedy otrzymamy prawidłową odpowiedź, usuwamy rekord z bazy danych. Jeśli jesteśmy offline, te rzędy się rozrastają, a następnym razem, gdy będziemy online, zostaną wysłane. Nie jest to wykonalny model we wszystkich sytuacjach, ale można go dostosować do większości.

W wersji 3.0 masz dostęp do CoreData, który jest doskonałym narzędziem do zarządzania danymi. Poza tym, rodzina NSURLXXX jest twoim przyjacielem.

 4
Author: Ben Gottlieb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-13 02:12:39

Przechowywałbym wszystkie informacje, które Zbieram w trybie offline w bazie danych SQLite. Następnie, na żądanie użytkownika, możesz zsynchronizować wszystkie przechowywane informacje z serwerem za pomocą protokołu HTTP lub niestandardowego protokołu TCP / IP, który możesz wymyślić.

Używam tego podejścia w aplikacjach Palm OS od prawie 10 lat i działają one bardzo efektywnie.

Z tego co wiem, jedynym "narzędziem", które będziesz musiał osiągnąć, jest zwykły stary OBJECTIVE-C Z Cocoa Touch. Chociaż możesz użyć niektóre biblioteki TCP / IP C++, które ułatwią Ci życie, jeśli zdecydujesz się zaimplementować własny protokół.

 2
Author: Pablo Santa Cruz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-27 02:59:52

Http://blog.webscale.co.in/?p=159 w tym artykule wymieniono metody obsługi synchronizacji danych offline / online. Może Ci pomóc, jeśli chcesz stworzyć swój własny framework.

 2
Author: Adi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-13 10:19:07

Zastanawiam się, czy rozważałeś użycie frameworka synchronizacji do zarządzania synchronizacją. Jeśli to Cię interesuje, możesz przyjrzeć się projektowi open source, usłudze synchronizacji OpenMobster. Możesz wykonać następujące operacje synchronizacji

  • dwukierunkowe
  • klient jednokierunkowy
  • urządzenie jednokierunkowe
  • bootup

Poza tym wszystkie modyfikacje są automatycznie śledzone i synchronizowane z chmurą. Aplikacja może być wyłączona, gdy połączenie sieciowe jest wyłączone. Będzie śledzić wszelkie zmiany i automatycznie w tle synchronizują go z chmurą po powrocie połączenia. Zapewnia również synchronizację, jak iCloud, na wielu urządzeniach

Również modyfikacje w chmurze są synchronizowane za pomocą powiadomień Push, więc dane są zawsze aktualne, nawet jeśli są przechowywane lokalnie.

Oto link do projektu open source: http://openmobster.googlecode.com

Oto link do iPhone App Sync: http://code.google.com/p/openmobster/wiki/iPhoneSyncApp

 1
Author: openmobster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-18 17:56:29