NSUserDefaults, simülatörde uygulama kaldırıldıktan sonra temizlenmedi


95

bu kulağa gerçek HAYIR gelebilir! Kullandığım çalıştırma sayısını korumak için, kullanıcının uygulamama ikinci kez girip girmediğini kontrol etmek istiyorum NSUserDefaults. Benim aşağıdaki kodu uygulamış rootViewController'ın viewDidLoadyöntemiyle:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

her şey yolunda gidiyor, ancak sorun şu ki, uygulamayı buraya ve buraya göre kaldırdığımda (silip yeniden yüklediğimde) veriler silinmeli, ancak bu değil ve uygulamayı yeniden yükledikten sonra önceki veriler hala görünüyor. Uygulamamı xCode6-beta kullanarak iOS simülatöründe çalıştırıyorum ve uygulamayı iOS 8'de hedefliyorum


2
Gerçek bir cihaz üzerinde test yapmayı denediniz mi?
Henry F

Simülatörde manuel olarak temizlemeniz gerekir. Nasıl yapacağınız burada .
Sergey Kalinichenko

Bu soru artık cevapsız yani doğru cevabı işaretleyin
Anders

1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID]. Uygulamam burada ios8'de çöküyor, ancak ios6 ve ios7'de iyi çalışıyor. Burada NSMutable Array ve UserId'deki seçili listeler bir dizedir.
Manthan

@Manthan bu nasıl farklı bir sorun, ancak başka bir yerde aynı sorunla karşılaştım ve çökmeye neden olan neden, bazı anahtarlar için kaydettiğim nesne bir olarak kaydedilmiş olmasına ve NSMutableArrayonu NSArraydeğiştirmek uygulamamın çökmesine neden oldu. .. Ben tasarruf tavsiye NSArraysen bunu döküm sonra kullanmak istediğinizde ve NSMutableArraykullanma [NSMutableArray arrayWithArray:array];. Umarım bu yardımcı olur.
Rıza Shayestehpour

Yanıtlar:


169

Bunun iOS8 Beta Simulator'daki bir hatadan kaynaklandığını düşünüyorum.

Beklenen davranış, uygulama silindiğinde, o uygulamaya ilişkin NSUserDefaults'un da silinmesidir.

  • Ancak, NSUserDefaults edilir DEĞİL Eğer simülatörü bir uygulamayı kaldırmak silinir.
  • İOS8 çalıştıran fiziksel bir aygıttan sildiğinizde doğru şekilde silinirler.

Şimdilik hızlı ve can sıkıcı bir çözüm, iOS Simülatörü -> İçeriği ve Ayarları Sıfırla'yı tıklamaktır.

Simülatör 10 ile Xcode 9.2, bu sorunu hala sunmaktadır. Menü seçeneği artık Donanımdır .. Tüm İçeriği ve Ayarları Sil

Bir hata raporu gönderdim btw


45
İOS 8 GM'de test edildi ve hata hala var. Çok sinir bozucu.
Manfred Scheiner

1
Bu hatalı davranışı Xcode 6 GM simülatöründe ve iOS 8'de (12A365) da doğrulayabilirim!
Boris Brdarić


1
XCode 6.1 (6A1052d) güncellemesinden sonra hata SDK 8.1'de düzeltilmiş gibi görünüyor
kas-kad

2
Aynı sorunu yaşayan herkes için. Aynı grup altında birden fazla uygulamanız varsa ve bunların tümü uygulama grupları kullanıyorsa (yetenekler altında AÇIK), kullanıcı varsayılanlarının silinmesi için tüm uygulamaları cihazdan kaldırmanız gerekir. Kullanıcı varsayılanları paylaşıldığından, uygulamalardan biri cihazda olsa bile bu uygulama kullanıcı varsayılanlarını kullanacağından silinmeyecektir.
Ankit Srivastava

14

İçeriği ve Ayarları Sıfırla nükleer bir seçenek olduğundan, iOS 8 / Xcode 6 GM simülatöründeki hata giderilinceye kadar iki seçeneği daha değerlendirebilirsiniz:

  1. NSUserDefaultsDepolanan plist dosyasını manuel olarak silebilirsiniz . Bu şu anda adresinde ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist bulunuyor UUID dizin adları arasında çalışmak için doğru simülatörü bulmak biraz sıkıcı. DÜZENLEME : 2014-10-28 20-34-52 Doğru yol: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Bu plist üzerinde "ameliyat" gerçekleştirebilirsiniz (belki bir çalıştırma komut dosyası oluşturma aşaması kullanarak), örneğin, plistbuddy kullanarak

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist


/ Data / after / * some_device_id * /
ahbap

5

Aynı sorunu yaşayan herkes için.

Aynı grup altında birden fazla uygulamanız varsa ve bunların tümü uygulama grupları kullanıyorsa (yetenekler altında AÇIK), kullanıcı varsayılanlarının silinmesi için tüm uygulamaları cihazdan kaldırmanız gerekir.

Kullanıcı varsayılanları paylaşıldığından, uygulamalardan biri cihazda olsa bile bu uygulama kullanıcı varsayılanlarını kullanacağından silinmeyecektir.


4

Kod, cihazda düzgün çalışmalıdır. Belki simülatördeki bazı hatalar.

Simülatörün İçeriğini ve Ayarlarını Sıfırlamayı deneyin.


1
İçeriği ve Ayarları Sıfırlamak sorunsuz çalışıyor ve şu anda kontrol etmem gereken bir cihazım yok. tnx :)
Reza Shayestehpour

4

bu bir hatadır ve NSUserDefaults'u aşağıdaki kodla silebilirsiniz

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

2

Bu hala bir hata olsa da, başka bir seçenek, NSUserDefaults'daki belirli anahtar (lar) ı kaldırmak olabilir. Çoğu zaman, test ederken / geliştirirken, NSUserDefaults'daki her şeyi değil, yalnızca birkaç anahtarı önemsiyoruz. Eklemeyi önerdiğimden yalnızca birkaç anahtarı önemsiyorsanız removeObjectForKey:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

Eklemek removeObjectForKey, uygulamanın ilk çalışmasını simüle eder, yorum yapmak, sonraki tüm uygulama çalıştırmalarını simüle eder.


2

Benim durumumda * .plist'i aşağıdaki dizinde buldum:

[1] / Users / SOME-USERNAME / Library / Developer / CoreSimulator / Devices / SOME-DEVICE-ID /data/Library/Preferences/SP.UserDefaultsTest.plist

Sorun: Uygulama xCode 6'da (iOS 8 simülatörü) siliniyor ancak dosya yukarıda belirtildiği gibi diskte kalıyor.

Çözüm: Bulunan dosyanın [1] yolundan manuel olarak silinmesi ve NSUserDefaults ortadan kalktı.

Bu yüzden simülatörü sıfırlamanın can sıkıcı yolu artık gerekli değil.

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.