Uygulamanız arka planda çalışırken ve NSUserDefaults'da depolanan değerlerinize erişemediğinizde bu duruma dikkat edin:
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ı?
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.