NSUserDefaults, Appstore'daki bir uygulamaya yönelik bir Güncelleme yoluyla devam ediyor mu?


106

Durum bu mu? NSUserDefaults, App Store'daki bir uygulamaya güncelleme gönderdiğinizde sıfırlanıyor mu yoksa sıfırlanıyor mu?

Uygulamam güncellendiğinde kilitleniyor, ancak tam olarak indirildiğinde kilitlenmiyor - bu nedenle, güncellenmiş oturumda yeni indirilen oturumdan neyin farklı olabileceğini belirlemeye çalışıyorum.

Şerefe, Nick.


Belgeler ve Kitaplık'taki dosyalar belge talepleri olarak korunacaktır : developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…
Geri Borbás

Yanıtlar:


116

Kullanıcı uygulamayı silmediği sürece genellikle sıfırlanmazlar. Temel veriler için, NSUserDefaults tercihler, tarihler, dizeler vb. Gibi verileri kaydetmenin en iyi yoludur. Görüntüleri ve dosyaları kaydetmek istiyorsanız, dosya sistemi daha iyi bir seçenektir.


5
Apple belgelerinde bundan bahsedildiği bir yer var mı?
Nick Cartwright

1
Üzgünüm - Hızlı cevabınız için teşekkür etmeyi unuttum! - Herkes bunu söyleyen herhangi bir Apple belgesine bağlantı bulabilirse, bu mükemmel olurdu .... NSUserDefaults belgelerinde bununla ilgili hiçbir şey yazmıyor, bu yüzden sanırım (yanlış) varsayılanların silindiğini varsaydım. Bu, Apple'ın uygulamaları kesinlikle güncellemesinin en güvenli yolu gibi görünüyor!
Nick Cartwright

En güvenli yol bu olabilir, ancak bir uygulama her güncellendiğinde tüm tercihlerini yeniden ayarlamaları gerekse, kullanıcılar için inanılmaz derecede can sıkıcı olurdu. Genelde günde üç veya dört uygulama güncellemem var; Eminim diğer iPhone kullanıcılarının daha da fazlası vardır. Her güncelleme için tercihleri ​​silmek temelde iPhone'umu kullanılamaz hale getirir.
Kristopher Johnson

1
Belgeler klasöründeki veriler, NSUserDefaults gibi kolayca kaybolabilir. Her ikisi de nadir görülen durumlardır ve normal yükseltme işlemiyle kesinlikle hiçbir ilgisi yoktur
coneybeare

1
Teşekkürler Kristopher - ve evet katılıyorum. Benim sorunum, programatik olayları saklamak için NSUserDefaults'u kullanmam ve uygulama yüklendiğinde bunların sıfırlanmasına güvenmemdi. İPhone cihazındaki tüm testlerim (ve Elmalar testi) uygulamayı yeni bir yükleme olarak test etti. Herhangi bir belge veya güncelleme olarak test etmenin bir yolu olmadan, tüm müşterilerimizin şu anda yaşadığı güncelleme çökmesini tekrarlayamadım. Özetlemek gerekirse - muhtemelen zor yoldan öğrenilen bir ders !!
Nick Cartwright

7

Cevabın EVET olduğuna inanıyorum, devam edecek. Bu ayrıca Apple iPhone OS Programlama Kılavuzundaki Uygulama Dizini bölümünde tam olarak belgelenmiştir.


4
  1. Gönderilen soruya doğrudan cevap: EVET.
  2. Sorununuz: Uygulamanız mantık sorunları nedeniyle kilitlendi. Bir nesneyi varsayılan olarak depoladığınızı ve uygulamanın açılışta (veya başka bir yerde) değerini kontrol ettiğini varsayalım. Güncellemenizde, kontrol edilme veya kullanılma şeklini değiştirebilirsiniz, örneğin bir değer beklersiniz, ancak nesne sıfırdır veya tam tersi. Bu bir SIGABRT veya EXC_BAD_ACCESS'e neden olabilir.

2

CoreData modeliniz varsa ve modelinizde bir şeyi değiştirdiyseniz ve geçişi yönetmeden güncelleme yaptıysanız, muhtemelen uygulamanızın güncellemede çökmesinin nedeni budur ...


Bunun bir durum olabileceğini umuyorum :) NSUserdefault değil
Julian Król

1

Benzer bir deneyimim var. Uygulamamız, Settings.Bundle / Root.Plist'te bir sürüm numarası saklar. Bu, iPhone Ayarları uygulaması aracılığıyla görüntülenir. Bulduğumuz şey, bir Yüklemede sürüm numarasının uygulama paketinden yüklenmesidir - bu nedenle sürüm numarası doğrudur. Ancak bir güncellemede sürüm numarası değişmez. Bu, kullanıcının uygulamanın önceki bir sürümünü çalıştırdığı izlenimini verir. Sürüm numarasına bağlı herhangi bir mantığımız yok, sadece görüntüleme amaçlı (hataların teşhisi sırasında iletişim merkezi personeli tarafından kullanılabilir).

Deneyimimiz, NSUserDefaults, bir kullanıcı uygulamamızı güncellediğinde silinmez, ancak Ayarlar ekranı da güncellenmez.


0

Uygulamanız arka planda çalışırken ve NSUserDefaults'da depolanan değerlerinize erişemediğinizde bu duruma dikkat edin:

Eric:

Bununla ilgili birçok iş parçacığı ve hata var, ancak ios 9'da tekrar başıma geliyor. NSURLSession görevlerine ve içeriğe uygun itmelere yanıt olarak arka planda başlayan bir uygulamam var. Tekrarlanabilir bir şekilde, telefonumu yeniden başlatırsam ve uygulamamın arka planda başlatılmasını beklersem, uygulamayı açtığımda [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] öğesinin tüm sistem değerlerini (ör. AppleITunesStoreItemKinds vb.) İçerdiğini ancak içermediğini görüyorum belirlediğim değerlerden herhangi biri. Uygulamayı zorla bırakıp yeniden başlatırsam tüm değerlerim geri gelir. Telefonun kilidi açılmadan önce "boş" standart Kullanıcı Varsayılanlarını önbelleğe almasını önlemenin bir yolu var mı, yoksa en azından ne zaman karıştırıldıklarını belirlemek ve uygulamayı zorla kapatmak zorunda kalmadan düzeltmek için bir yol var mı?

Eskimo (eskimo1@apple.com):

Buradaki sorun, NSUserDefaults'un nihayetinde uygulamanızın kapsayıcısındaki bir dosya tarafından yedeklenmesi ve uygulamanızın kapsayıcısının veri korumasına tabi olmasıdır. O zaman özel bir şey yapmazsanız, iOS 7 ve sonraki sürümlerde, kapsayıcınız NSUserDefaults yedekleme deposu tarafından miras alınan bir değer olan NSFileProtectionCompleteUntilFirstUserAuthentication kullanır ve bu nedenle ilk kilit açma işleminden önce ona erişemezsiniz.

IMO'nun bunu aşmanın en iyi yolu, arka planda çalıştırılabilen kod yollarında güvendiğiniz şeyler için NSUserDefaults'dan kaçınmaktır. Bunun yerine, bu ayarları, veri korumasını açıkça yönetebileceğiniz kendi tercihler dosyanızda saklayın (bu durumda bu, 'NSFileProtectionNone olarak ayarlanmış' anlamına gelir).

Bir veri koruma bağlamında NSUserDefaults ile ilgili iki sorun vardır:

Tamamen soyut bir API'sidir: destek deposunun varlığı ve konumu bu API'nin bir parçası olarak kabul edilmez, bu nedenle veri korumasını açıkça yönetemezsiniz.

Not OS X NSUserDefaults'ın son sürümlerinde, bir arka plan programı tarafından yönetilmektedir ve destek deposunu doğrudan değiştirmeye çalışan kişiler, sorunlarla karşılaşmıştır. Aynı türden bir şeyin bir noktada iOS'a geldiğini hayal etmek kolaydır.

Veri korumasını değiştirmek mümkün olsa bile, NSUserDefaults, verileri kullandığınız bağlama göre sınıflandıracak bir mekanizmaya sahip değildir; bu bir 'ya hep ya hiç' API'sidir. Sizin durumunuzda, korumayı tüm kullanıcı varsayılanlarınızdan kaldırmak istemezsiniz, yalnızca ilk kilidi açmadan önce arka planda erişmeniz gerekenler.

Son olarak, bu verilerden herhangi biri gerçekten hassassa, anahtar zincirine koymalısınız. Bilhassa, anahtarlık, veri korumasını her öğe için ayrı ayrı ayarlama yeteneğine sahiptir.

Kaynak: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.