253

キーチェーンにidandersen の scifihifi-iphoneコードを使用し、次を使用してパスワードを保存しています

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

デバイスからアプリケーションを削除すると、パスワードがキーチェーンに残ります。

ユーザーがデバイスからアプリケーションを削除したときに、キーチェーンからパスワードを削除したいと考えています。これどうやってするの?

4

9 に答える 9

425

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」キー/値をチェックして設定します。キーチェーンから値を削除するコードを配置する必要があるコメントがあります。Synchronize を呼び出して、システムがアプリを永続化する前にユーザーが手動でアプリを強制終了した場合に備えて、"FirstRun" キー/値がすぐに永続化されるようにすることができます。

于 2011-06-01T15:00:51.877 に答える
32

アプリがデバイスから削除されたときにコードを実行するトリガーはありません。キーチェーンへのアクセスは、アプリケーションの署名に使用されるプロビジョニング プロファイルに依存します。したがって、他のアプリケーションはキーチェーン内のこの情報にアクセスできません。

ユーザーがデバイスからアプリケーションを削除したときにキーチェーンのパスワードを削除しようとするのには役立ちませんが、(元のアプリケーションの再インストールからのみ) パスワードにアクセスできないという安心感が得られるはずです。

于 2011-04-19T02:52:04.897 に答える
29

@amroの回答のSwiftバージョンを探している人のために:

    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
    }
于 2015-10-24T14:18:20.527 に答える
8

ユーザーがアプリをアンインストールすると、アプリのドキュメント ディレクトリからファイルが削除されます。これを知っていれば、 で最初にファイルが存在するかどうかを確認するだけで済みますapplication:didFinishLaunchingWithOptions:。その後、無条件にファイルを作成します (たとえそれが単なるダミー ファイルであっても)。

チェック時にファイルが存在しなかった場合は、これが最新のインストール以降の最初の実行であることがわかります。アプリで後で知る必要がある場合は、ブール値の結果をアプリのデリゲート メンバーに保存します。

于 2013-09-14T02:19:40.590 に答える