web-dev-qa-db-ja.com

アプリのアンインストール時にキーチェーンアイテムを削除する

私は idandersenのscifihifi-iphone を使用しています

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

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

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

223
enc

NSUserDefaultsareがアプリのアンインストールによってクリアされるという事実を利用できます。例えば:

- (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」キー/値がすぐに永続化されるようにできます。

384
Amro

@ -amroの答えのSwift 3.バージョンを探しているユーザーの場合:

let userDefaults = UserDefaults.standard

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

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

* synchronize()関数は廃止されることに注意してください

28
Brad Cooley

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

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

28

@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
    }
26
rsc

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

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

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

5
stephen

@ amroの答え Swift 4.0に変換:

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

これは、動作に基づいたiOS 10.3のデフォルト動作のようです 人々は目撃しています ベータ2で。これに関する公式文書はまだ見つかっていないので、もしあればコメントしてください。

3
Stavash