私たちのアプリでまさにそれを行い、それはうまく機能します.フルバージョンにアップグレードできる無料のアプリであり、キーチェーンにアップグレードインジケーターを保存します. アップグレード インジケータは選択した任意の文字列ですが、キーチェーンではパスワードとして扱われます。つまり、kSecValueData の値はキーチェーンで暗号化されます。このアプローチの良い点は、ユーザーがアプリを削除してから再インストールした場合、キーチェーン アイテムがアプリとは別に保存されるため、魔法のようにすべてが再び有効になることです。また、ユーザーの既定値に何かを保存するための追加作業はほとんどないため、それだけの価値があると判断しました。
セキュリティ アイテムを作成する方法は次のとおりです。
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
[dict setObject: (id) kSecClassGenericPassword forKey: (id) kSecClass];
[dict setObject: kYourUpgradeStateKey forKey: (id) kSecAttrService];
[dict setObject: kYourUpgradeStateValue forKey: (id) kSecValueData];
SecItemAdd ((CFDictionaryRef) dict, NULL);
セキュリティ項目を見つけてその値を確認する方法は次のとおりです。
NSMutableDictionary* query = [NSMutableDictionary dictionary];
[query setObject: (id) kSecClassGenericPassword forKey: (id) kSecClass];
[query setObject: kYourUpgradeStateKey forKey: (id) kSecAttrService];
[query setObject: (id) kCFBooleanTrue forKey: (id) kSecReturnData];
NSData* upgradeItemData = nil;
SecItemCopyMatching ( (CFDictionaryRef) query, (CFTypeRef*) &upgradeItemData );
if ( !upgradeItemData )
{
// Disable feature
}
else
{
NSString* s = [[[NSString alloc]
initWithData: upgradeItemData
encoding: NSUTF8StringEncoding] autorelease];
if ( [s isEqualToString: kYourUpgradeStateValue] )
{
// Enable feature
}
}
upgradeItemData が nil の場合、キーは存在しないため、アップグレードが存在しないか、アップグレードされていないことを意味する値が設定されていると想定できます。
アップデート
kSecReturnData を追加しました (指摘してくれた @Luis に感謝します)
GitHub のコード (ARC バリアント)