我们在我们的应用程序中做到了这一点,它运行良好。这是一个免费应用程序,您可以升级到完整版本,我们将升级指示器存储在钥匙串中。升级指示符是您选择的任意字符串,但出于钥匙串的目的,它被视为密码,即 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 变体)