Czy NSUserDefaults utrzymuje się przez aktualizację aplikacji w Appstore?

106

Czy tak jest? Czy NSUserDefaults są resetowane po przesłaniu aktualizacji do aplikacji w App Store, czy też są resetowane?

Moja aplikacja ulega awarii po zaktualizowaniu, ale nie ulega awarii po pełnym pobraniu - więc próbuję określić, co może się różnić w zaktualizowanej sesji od świeżo pobranej sesji.

Pozdrawiam, Nick.

Nick Cartwright
źródło
Pliki w Dokumentach i Bibliotece zostaną zachowane zgodnie z dokumentacją: developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…
Geri Borbás

Odpowiedzi:

116

Zwykle nie są resetowane, chyba że użytkownik usunie aplikację. W przypadku danych podstawowych NSUserDefaults to najlepszy sposób na zapisywanie danych, takich jak preferencje, daty, ciągi znaków itp. Jeśli chcesz zapisać obrazy i pliki, lepszym rozwiązaniem jest system plików.

coneybeare
źródło
5
Czy jest gdzieś w dokumentacji Apple'a, o którym jest mowa?
Nick Cartwright
1
Przepraszam - zapomniałem podziękować za szybką odpowiedź! - Jeśli ktoś może znaleźć link do jakiejkolwiek formy dokumentacji Apple, która to mówi, byłoby wspaniale ... W dokumentacji NSUserDefaults nic o tym nie mówi, więc myślę, że (błędnie) założyłem, że ustawienia domyślne zostaną wyczyszczone. Wydawałoby się to najbezpieczniejszym sposobem dla Apple na aktualizację aplikacji!
Nick Cartwright
Może to być najbezpieczniejszy sposób, ale byłoby to niezwykle irytujące dla użytkowników, gdyby musieli ponownie ustawić wszystkie swoje preferencje po każdej aktualizacji aplikacji. Generalnie mam trzy lub cztery aktualizacje aplikacji dziennie; Jestem pewien, że inni użytkownicy iPhone'a mają jeszcze więcej. Wyczyszczenie preferencji dla każdej aktualizacji zasadniczo uniemożliwiłoby korzystanie z mojego iPhone'a.
Kristopher Johnson
1
Dane w folderze dokumentów mogą zniknąć równie łatwo jak NSUserDefaults. Są to jednak rzadkie sytuacje i nie mają absolutnie nic wspólnego z normalnym procesem aktualizacji
coneybeare
1
Dzięki Kristopher - i tak, zgadzam się. Mój problem polegał na tym, że użyłem NSUserDefaults do przechowywania zdarzeń programowych i polegałem na ich resetowaniu po zainstalowaniu aplikacji. Wszystkie moje testy na urządzeniu iPhone (i testy Apple) testowały aplikację jako nową instalację. Bez żadnej dokumentacji ani możliwości przetestowania aktualizacji nie mogłem powtórzyć awarii aktualizacji, której doświadczają teraz wszyscy nasi klienci. Podsumowując - pewnie lekcja wyuczona na własnej skórze !!
Nick Cartwright
7

Wierzę, że odpowiedź brzmi TAK, będzie trwać. Jest to również w pełni udokumentowane w rozdziale Katalog aplikacji w Przewodniku programowania systemu operacyjnego Apple iPhone.

leon
źródło
4
  1. Bezpośrednia odpowiedź na zadane pytanie: TAK.
  2. Twój problem: Twoja aplikacja uległa awarii z powodu problemów logicznych. Załóżmy, że przechowujesz obiekt w ustawieniach domyślnych, a aplikacja sprawdza jego wartość podczas uruchamiania (lub w innym miejscu). W trakcie aktualizacji możesz zmienić sposób, w jaki jest sprawdzany lub używany, np. Oczekujesz wartości, ale obiekt jest zerowy lub odwrotnie. Może to spowodować SIGABRT lub EXC_BAD_ACCESS.
John Smith
źródło
2

Jeśli masz model CoreData i zmieniłeś coś w swoim modelu i zaktualizowałeś, bez zarządzania migracją, prawdopodobnie jest to powód, dla którego Twoja aplikacja ulega awarii podczas aktualizacji ...

Bojan Bozovic
źródło
Spodziewałbym się, że to może być przypadek :) not a NSUserdefault
Julian Król
1

Mam podobne doświadczenie. Nasza aplikacja przechowuje numer wersji w Settings.Bundle / Root.Plist. Jest to wyświetlane w aplikacji Ustawienia iPhone'a. Odkryliśmy, że w przypadku instalacji numer wersji jest ładowany z pakietu aplikacji - dlatego numer wersji jest poprawny. Jednak w przypadku aktualizacji numer wersji się nie zmienia. Daje to wrażenie, że użytkownik korzysta z poprzedniej wersji aplikacji. Nie mamy logiki związanej z numerem wersji, służy ona tylko do wyświetlania (może być wykorzystana przez personel contact center przy diagnozowaniu usterek).

Z naszego doświadczenia wynika, że ​​NSUserDefaults nie jest usuwany, gdy użytkownik aktualizuje naszą aplikację, ale ekran Ustawienia również nie jest aktualizowany.

Derek Knight
źródło
0

Pamiętaj o tym przypadku, gdy Twoja aplikacja działa w tle i nie możesz uzyskać dostępu do przechowywanych wartości w NSUserDefaults:

Eric:

Było wiele wątków i błędów na ten temat, ale to się dzieje ponownie w iOS 9. Mam aplikację, która uruchamia się w tle w odpowiedzi na zadania NSURLSession i wypychania dostępnych treści. Powtarzalnie, jeśli ponownie uruchomię telefon i zaczekam na uruchomienie aplikacji w tle, po otwarciu aplikacji stwierdzam, że [[NSUserDefaults standardUserDefaults] DictionaryRepresentation] zawiera wszystkie wartości systemowe, np. AppleITunesStoreItemKinds itp., Ale nie zawiera dowolna z ustawionych przeze mnie wartości. Jeśli wymuszę zamknięcie i ponowne uruchomienie aplikacji, wrócą wszystkie moje wartości. Czy jest jakiś sposób, aby uniknąć buforowania „pustych” standardUserDefaults przed odblokowaniem telefonu lub przynajmniej określić, kiedy są pomieszane i naprawić je bez konieczności wymuszania zamykania aplikacji?

Eskimo ([email protected]):

Problem polega na tym, że NSUserDefaults jest ostatecznie obsługiwany przez plik w kontenerze aplikacji, a kontener aplikacji podlega ochronie danych. Jeśli nie zrobisz nic specjalnego, w systemie iOS 7 i nowszych kontener używa NSFileProtectionCompleteUntilFirstUserAuthentication, wartości dziedziczonej przez magazyn zapasowy NSUserDefaults, więc nie możesz uzyskać do niego dostępu przed pierwszym odblokowaniem.

IMO najlepszym sposobem obejścia tego jest unikanie NSUserDefaults dla rzeczy, na których polegasz w ścieżkach kodu, które mogą być wykonywane w tle. Zamiast tego przechowuj te ustawienia w swoim własnym pliku preferencji, takim, którego ochroną danych możesz jawnie zarządzać (w tym przypadku oznacza to „ustaw na NSFileProtectionNone”).

W kontekście ochrony danych występują dwa problemy z NSUserDefaults:

Jest to w pełni abstrakcyjny interfejs API: obecność i lokalizacja jego magazynu zapasowego nie jest uważana za część tego interfejsu API, więc nie można jawnie zarządzać jego ochroną danych.

Uwaga W najnowszych wersjach OS X NSUserDefaults jest zarządzany przez demona, a ludzie, którzy próbują bezpośrednio manipulować jego magazynem zapasowym, napotykają problemy. Łatwo sobie wyobrazić, że coś takiego pojawi się w pewnym momencie na iOS.

Nawet jeśli zmiana ochrony danych byłaby możliwa, NSUserDefaults nie ma mechanizmu klasyfikowania danych na podstawie kontekstu, w którym ich używasz; jest to API typu „wszystko albo nic”. W Twoim przypadku nie chcesz usuwać ochrony ze wszystkich domyślnych ustawień użytkownika, tylko te, do których potrzebujesz dostępu w tle przed pierwszym odblokowaniem.

Wreszcie, jeśli którekolwiek z tych danych są naprawdę wrażliwe, należy umieścić je w pęku kluczy. Warto zauważyć, że pęku kluczy można ustawić ochronę danych na podstawie poszczególnych pozycji.

Źródło: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

Grand M
źródło