Bir uygulama kaldırıldığında anahtarlık öğelerini silme


238

Ben kullanıyorum idandersen en scifihifi-iphone anahtarlık için kod ve şifre kaydetmek kullanarak

[SFHFKeychainUtils storeUsername:@"User" andPassword:@"123"
              forServiceName:@"TestService" updateExisting:YES error:&error];

Uygulamayı cihazdan sildiğimde şifre anahtarlıkta kalır.

Kullanıcı uygulamayı cihazdan sildiğinde şifreyi anahtarlıktan kaldırmak istiyorum. Bunu nasıl yapabilirim?


13
Kodunuz uygulamanız silinirken çalışmadığından bunu yapmanın bir yolu yoktur.
Jonathan Grynspan

1
Bir anahtarlık öğesini yalnızca uygulamanın içinden silebileceğinizi, ancak kaldırmadan önce silebileceğinizi düşünüyorum. Anahtarlıktan bir kullanıcı adı veya parola silmek için SFHFKeychainUtils'in deleteItem yöntemine göz atabilirsiniz.
matteodv

Yanıtlar:


406

Sen aslında yararlanabilirsiniz NSUserDefaults olan bir uygulamanın kaldırma tarafından temizlendi. Örneğin:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Clear keychain on first run in case of reinstallation
    if (![[NSUserDefaults standardUserDefaults] objectForKey:@"FirstRun"]) {
        // Delete values from keychain here
        [[NSUserDefaults standardUserDefaults] setValue:@"1strun" forKey:@"FirstRun"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    }

    //...Other stuff that usually happens in didFinishLaunching
}

Bu NSUserDefaults, henüz ayarlanmamışsa uygulamanızın ilk çalıştırılmasında "FirstRun" anahtarını / değerini kontrol eder ve ayarlar . Anahtar zincirinden değerleri silmek için kod koymanız gereken bir yorum var. Senkronize etmek, kullanıcının sistem devam etmeden uygulamayı manuel olarak öldürmesi durumunda "FirstRun" tuşunun / değerinin hemen devam etmesini sağlamak için çağrılabilir.


2
Uygulamanın ilk çalıştırılmasında anahtarlığınızı silebileceğiniz / temizleyebileceğiniz Amro'ya katılıyorum. Bu, uygulamanın son kaldırılmasından önce ayarlanan her şeyi temizler. Bunu Facebook / Twitter kimlik bilgilerini depolayan uygulamalarımdan biri için yaptım ve sadece uygulamanızın ayarlanmış olan anahtarlığa erişebildiğini bilerek oldukça iyi çalışıyor.
XCool

Bu ipucu için teşekkürler.
iOSAppDev

3
Kullanıcı uygulamadan manuel olarak çıktığında NSUserDefaults temizlenmez. Bu durumda yalnızca ayarladığınız değerler veya sistem (periyodik olarak) veya henüz diskle senkronize edilmemiş (arayarak synchronize) değerler kaybolur. İlk çalıştırma tuşunu ayarladıktan sonra senkronizasyonu çağırmak iyi bir fikirdir. Ve evet, bir cihaz sıfırlandığında (ve yedeklemeden geri yüklenmediğinde) NSUserDefaults silinir ve bu durumda sorun yoktur.
Amro

5
Yanılıyorsunuz ve muhtemelen kullanıcı varsayılanlarının silinmesine neden olan bir şey yapıyorsunuz. NSUserDefaults'un tüm amacı tercihleri ​​kaydetmek ve bu tercihlerin birden fazla uygulama lansmanı ile devam etmesini sağlamaktır. Yine, cihazı sıfırlamak veya bir uygulamayı silmek kullanıcı varsayılanlarını kaldıracaktır. Bu cevaba kaç kişi oy verdi ve kodunuzu kontrol edin. Ardından belgeleri okuyun. Heck, bana ilgili kodu gönder, sana ne yaptığını göstereceğim . İOS 2.0'dan beri bu şekilde oldu. Aşağı oy verin ama önce izole, basit, test senaryosu yazmanızı öneririm.
Amro

9
Bunun için NSUserDefault kullanma konusunda çok emin olmazdım. Neden? Şu konuya bir göz atın: stackoverflow.com/questions/20269116/… . Uygulamanızı arka plandan başlatırsanız, NSUserDefaults içindeki özel anahtarlarınızın ayarlanmadığı durumlar vardır. Bu cevabı uygulamak, gerçekten istemediğiniz halde Anahtarlık özel anahtarlarınızı silmenize neden olur!
Aurelien Porte

40

@ Amro'nun cevabının Swift 3.0 sürümünü arayan kullanıcılar için :

let userDefaults = UserDefaults.standard

if !userDefaults.bool(forKey: "hasRunBefore") {
     // Remove Keychain items here

     // Update the flag indicator
     userDefaults.set(true, forKey: "hasRunBefore")
}

* synthesize () işlevinin kullanımdan kaldırıldığını unutmayın


2
if !userDefaults.bool(forKey: "hasRunBefore") {Sadece daha temiz.
nefarianblack

1
Senkronizasyon çağrısı kaldırılmalıdır.
Pochi

30

Uygulama cihazdan silindiğinde kod gerçekleştirmek için tetikleyici yoktur. Anahtarlıklara erişim, uygulamayı imzalamak için kullanılan sağlama profiline bağlıdır. Bu nedenle, başka hiçbir uygulama anahtarlıktaki bu bilgilere erişemez.

Kullanıcı uygulamayı cihazdan sildiğinde anahtarlıktaki parolayı kaldırmayı hedeflemenize yardımcı olmaz, ancak parolanın erişilebilir olmadığı konusunda biraz rahatlık vermelidir (yalnızca orijinal uygulamanın yeniden yüklenmesinden).


Bu nedenle, uygulamamızın ön hazırlık profilini değiştirirsek, anahtarlıkta önceden depolanmış değerlere erişebilir mi?
Moaz Saeed

27

@ Amro'nun cevabının Swift versiyonunu arayanlar için:

    let userDefaults = NSUserDefaults.standardUserDefaults()

    if userDefaults.boolForKey("hasRunBefore") == false {

        // remove keychain items here


        // update the flag indicator
        userDefaults.setBool(true, forKey: "hasRunBefore")
        userDefaults.synchronize() // forces the app to update the NSUserDefaults

        return
    }

9

C # Xamarin sürümü

    const string FIRST_RUN = "hasRunBefore";
    var userDefaults = NSUserDefaults.StandardUserDefaults;
    if (!userDefaults.BoolForKey(FIRST_RUN))
    {
        //TODO: remove keychain items
        userDefaults.SetBool(true, FIRST_RUN);
        userDefaults.Synchronize();
    }

... ve anahtarlıktaki kayıtları silmek için (yukarıdaki TODO yorumu)

        var securityRecords = new[] { SecKind.GenericPassword,
                                    SecKind.Certificate,
                                    SecKind.Identity,
                                    SecKind.InternetPassword,
                                    SecKind.Key
                                };
        foreach (var recordKind in securityRecords)
        {
            SecRecord query = new SecRecord(recordKind);
            SecKeyChain.Remove(query);
        }

1
if (VersionTracking.IsFirstLaunchEver) {// remove keychain items}Xamarin.Essentials kullanarak kullanarak için kodu gerekmez userDefaults. Xamarin.Essentials bunu sizin için sarar .
Christopher Stephan

7

Kullanıcı uygulamayı kaldırdığında dosyalar uygulamanızın belge dizininden silinecektir. Bunu bilerek, yapmanız gereken tek şey bir dosyanın ilk gerçekleşen şey olup olmadığını kontrol etmektir application:didFinishLaunchingWithOptions:. Daha sonra, koşulsuz olarak dosyayı oluşturun (sadece kukla bir dosya olsa bile).

Dosya kontrol sırasında mevcut değilse, bunun en son yüklemeden bu yana ilk çalıştırma olduğunu bilirsiniz. Uygulamada daha sonra bilmeniz gerekiyorsa, boole sonucunu uygulama delege üyenize kaydedin.


7

@ amro'nun cevabı Swift 4.0'a çevrildi:

if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
    UserDefaults.standard.set(false, forKey: "FirstInstall")
    UserDefaults.standard.synchronize()
}

Ya da if !UserDefaults.standard.bool(forKey: "FirstInstall")anahtar yoksa varsayılan olarak yanlış olanı bile . Ve .synchronize () gerekli değildir.
CharlesA

3

Bu, insanların beta # 2'de tanık oldukları davranışa dayalı olarak iOS 10.3'teki varsayılan davranış gibi görünüyor . Bununla ilgili resmi bir belge bulamadık, lütfen varsa yorum yapın.


7
Sanırım beta 5, iOS 10.3 kamu salım kadar öyleydi gelmez bu değişikliği içerir.
Jakub Truhlář
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.