私は idandersenのscifihifi-iphone を使用しています
[SFHFKeychainUtils storeUsername:@"User" andPassword:@"123"
forServiceName:@"TestService" updateExisting:YES error:&error];
デバイスからアプリケーションを削除すると、パスワードはキーチェーンに残ります。
ユーザーがデバイスからアプリケーションを削除したときに、キーチェーンからパスワードを削除したい。これどうやってするの?
NSUserDefaults
areがアプリのアンインストールによってクリアされるという事実を利用できます。例えば:
- (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」キー/値がすぐに永続化されるようにできます。
@ -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()関数は廃止されることに注意してください
アプリがデバイスから削除されたときにコードを実行するトリガーはありません。キーチェーンへのアクセスは、アプリケーションの署名に使用されるプロビジョニングプロファイルに依存します。したがって、他のアプリケーションはキーチェーン内のこの情報にアクセスできません。
ユーザーがデバイスからアプリケーションを削除するときにキーチェーンのパスワードを削除することは目的に役立ちませんが、パスワードにアクセスできない(元のアプリケーションの再インストールからのみ)という安心感が得られます。
@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
}
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);
}
ユーザーがアプリをアンインストールすると、アプリのドキュメントディレクトリからファイルが削除されます。これを知って、あなたがしなければならないことは、ファイルがapplication:didFinishLaunchingWithOptions:
で最初に起こるものとして存在するかどうかをチェックすることです。その後、無条件にファイルを作成します(それが単なるダミーファイルであっても)。
チェック時にファイルが存在しなかった場合、これは最新のインストール以降の最初の実行であることがわかります。後でアプリで知る必要がある場合は、ブール値の結果をアプリのデリゲートメンバーに保存します。
@ amroの答え Swift 4.0に変換:
if UserDefaults.standard.object(forKey: "FirstInstall") == nil {
UserDefaults.standard.set(false, forKey: "FirstInstall")
UserDefaults.standard.synchronize()
}
これは、動作に基づいたiOS 10.3のデフォルト動作のようです 人々は目撃しています ベータ2で。これに関する公式文書はまだ見つかっていないので、もしあればコメントしてください。