2012-07-16 25 views
6

Moja aplikacja używa iCloud (magazynu kluczy i wartości) do synchronizowania unikalnego identyfikatora między wieloma urządzeniami. To działa akceptować w momencie, gdy naprawdę musi działać, przy pierwszym uruchomieniu aplikacji. Wygląda na to, że urządzenie nie jest jeszcze zaznajomione z wartościami z iCloud przy pierwszym uruchomieniu, tylko po zainstalowaniu aplikacji i działa już od jakiegoś czasu.Sklep iCloud KeyValue nie został rozpoznany przy pierwszym uruchomieniu.

Sprawdzam wartość iCloud w funkcji viewDidLoad w głównym widoku aplikacji.

Więc moje pytania:

  • Czy to jest normalne zachowanie?
  • Jeśli tak, czy istnieje inne rozwiązanie?
  • Czy to możliwe, że jest to problem tylko podczas uruchamiania z Xcode, a nie z wersji wysyłkowej? Jeśli tak, jak przetestować?

Dzięki!

Jasper

+0

Zobacz to pytanie: http://stackoverflow.com/questions/12539266/icloud-nsubiquitouskeyvaluestore-initial-sync-access-delay-how-to-handle – erkanyildiz

Odpowiedz

2

Podczas pierwszego uruchomienia iCloud włączona App musi wyciągnąć wszystkie dane z serwerów Apple. Czas potrzebny na to zależy od wielu rzeczy, na przykład od rodzaju sieci, w której aktualnie się znajdujesz (Edge, 3G, GPRS, WLAN). Zależy to również od tego, ile ruchu ma obecnie serwer iCloud, więc żądanie do serwera iCloud może zająć jeszcze kilka sekund, bez względu na to, jaki rodzaj łączności sieciowej posiadasz.

Podsumowując: Tak, brzmi to zupełnie normalnie.

Jeśli korzystanie z aplikacji zależy od tych ustawień, rozważ wdrożenie widoku "Czekaj" lub "Ładowanie", który pozostaje na ekranie tak długo, jak długo aplikacja musi przeprowadzić wstępną synchronizację i załadować wszystkie potrzebne dane z chmury. Aby nie blokować interfejsu użytkownika na zawsze, należy również wprowadzić limit czasu dla tego widoku (jeśli dane iCloud nie zostaną załadowane w ciągu X sekund, należy odrzucić widok i powiadomić użytkownika).

+0

Dzięki za odpowiedź! Czy istnieje sposób sprawdzenia, czy początkowa synchronizacja iCloud została zakończona? –

+0

Musisz zasubskrybować powiadomienie NSUbiquitousKeyValueStoreDidChangeExternallyNotification. Oto przykład w dokumentacji :-) http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/UserDefaults/StoringPreferenceDatainiCloud/StoringPreferenceDatainiCloud.html –

+0

@ BjörnKaiser Mam ten sam problem, ale nieważne jak długo poczekaj na pierwsze uruchomienie aplikacji, żadne powiadomienie nigdy nie przychodzi, i to jest, gdy wiem, że dane są obecne w keyValueStore w iCloud. – pulkitsinghal

1

Nie masz gwarancji, że NSUbiquitousKeyValueStore zakończyłaby swoją pierwszą synchronizację po uruchomieniu aplikacji po raz pierwszy. (W rzeczywistości w systemie iOS 5 często zaczyna się synchronizować po uruchomieniu aplikacji po raz pierwszy).

Nie można ustalić, czy pierwsza synchronizacja już się odbyła, jest w toku, czy została zakończona. Możesz (w rzeczywistości powinien) zasubskrybować NSUbiquitousKeyValueStoreDidChangeExternallyNotification. Sztuczka polega na tym, że jeśli twój sklep jest pusty na serwerze iCloud, nie dostaniesz żadnego powiadomienia po początkowej synchronizacji (ponieważ twój lokalny sklep jest pusty, a chmura jest również pusta, nic się nie zmieniło "zewnętrznie" po początkowym synchronizacja ...)

Zwykle nie powinieneś polegać na początkowej synchronizacji.

Bądź optymistą przy uruchomieniu, nawet jeśli Twój sklep jest pusty, od razu popchnij wartości (na przykład swój unikalny identyfikator). Jeśli początkowa synchronizacja odbywa się jednocześnie lub później i na serwerze istnieje już pewna wartość, lokalne wartości zostaną zresetowane do wartości serwera, a otrzymasz powiadomienie NSUbiquitousKeyValueStoreDidChangeExternallyNotification z uzasadnieniem NSUbiquitousKeyValueStoreInitialSyncChange.

Wreszcie, jeśli naprawdę sądzisz, że wiesz o zakończeniu początkowej synchronizacji, zgłoś błąd na stronie bugreport.apple.com i wyjaśnij, dlaczego naprawdę tego potrzebujesz.

6

Miałem podobny problem, gdy NSUbiquitousKeyValueStoreDidChangeExternallyNotification nie uruchamiał się przy pierwszym uruchomieniu po instalacji, bez względu na to, jak długo czekałem. Ustawienie początkowego klucza w NSUBiquitousKeyValueStore wydawało się rozwiązać ten problem.

Natychmiast po dodaniu obserwatorowi magazynu domyślnego, wzywam:

[[NSUbiquitousKeyValueStore defaultStore] setString:@"testValue" forKey:@"testKey"]; 
[[NSUbiquitousKeyValueStore defaultStore] synchronize]; 

używam różnych kluczy (czyli nie testKey) dla rzeczywistego danych chcę synchronizować.

+1

Zaimplementowałem to i wygląda na to, że działa dobrze. Podsumowując, nie polegam na żadnych danych, które otrzymuję z iCloud, dopóki moja funkcja obserwatora nie zostanie po raz pierwszy wywołana. Po wywołaniu widzę wszystkie wartości zapisane w poprzednich wystąpieniach aplikacji. Testuję to, usuwając aplikację, restartując telefon i czekając około 10 minut. Nie jestem pewien, czy wszystkie te kroki są wymagane, ale wydaje się, że system iOS zwraca zero dla danych początkowo, a następnie przychodzi poprawnie po tym, jak funkcja obserwatora zostanie wywołana kilka sekund później. – Nicholas

+0

Spróbuję tego rozwiązania ... zdeklaruję później .. – CthulhuJon

+0

nie pomogło. Po prostu wygląda na to, że odpowiedź serwera iCloud może być bardzo powolna podczas zapisywania lub ładowania, a twoja aplikacja musi obsługiwać te zdarzenia asynchroniczne. dane są zwykle dostępne .... "później", ale rzadko w ciągu 30 sekund od rozpoczęcia aplikacji. – CthulhuJon