2011-01-20 88 views
181

我使用刪除鑰匙串項目當應用被卸載

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

當我從設備中刪除該應用程序使用鑰匙串idandersen's scifihifi-iphone代碼並保存密碼,密碼保留在鑰匙串。

我想在用戶從設備中刪除應用程序時從鑰匙串中刪除密碼。我怎樣才能做到這一點?

+10

因爲當你的應用程序被刪除,你的代碼不能運行沒有辦法做到這一點。 – 2011-01-23 09:20:31

+1

我認爲你只能從應用程序內部刪除一個鑰匙串項目,但在卸載之前不能刪除它。您可以查看SFHFKeychainUtils的deleteItem方法以從鑰匙串中刪除用戶名或密碼。 – matteodv 2011-04-06 15:14:46

回答

330

您可以充分利用NSUserDefaults通過卸載應用程序清除的事實。例如:

- (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 
} 

這種檢查並設置您的應用程序第一次運行在一個NSUserDefaults「FirstRun」鍵/值,如果它尚未設置。有一個評論,你應該把代碼從keychain中刪除。可以調用Synchronize以確保「FirstRun」鍵/值立即保留,以防用戶在系統保留之前手動殺死應用程序。

+0

感謝您的提示。 – iOSAppDev 2013-04-30 06:49:04

24

從應用程序中刪除應用程序時沒有觸發器執行代碼。訪問鑰匙串取決於用於簽署應用程序的供應配置文件。因此,其他應用程序將無法訪問鑰匙串中的這些信息。

當用戶從設備上刪除應用程序時,它不會幫助您刪除密鑰鏈中的密碼,但它會讓您感到一些安慰(密碼不可訪問)(只能從重新安裝原始應用程序)。

5

當用戶卸載應用程序時,文件將從應用程序的文檔目錄中刪除。知道這一點,你所要做的就是檢查一個文件是否存在,作爲application:didFinishLaunchingWithOptions:中發生的第一件事。之後,無條件地創建文件(即使它只是一個虛擬文件)。

如果在檢查時文件不存在,您知道這是自從最新安裝以來的第一次運行。如果您需要在應用程序的後面瞭解,請將布爾結果保存到您的應用程序委託成員。

22

對於那些尋找@ AMRO的回答迅捷的版本:

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 
    } 
20

爲用戶尋找雨燕3.0版本@ AMRO的回答:

let userDefaults = UserDefaults.standard 

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

    // Update the flag indicator 
    userDefaults.set(true, forKey: "hasRunBefore") 
    userDefaults.synchronize() // Forces the app to update UserDefaults 
} 
3

這似乎是基於beta#2中的行爲people have been witnessing在iOS 10.3上的默認行爲。還沒有發現任何官方文件,所以請評論,如果你有。

0

C#Xamarin版本

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(); 
    } 

......並清除鑰匙串(如上TODO註釋)記錄

 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); 
     }