Мы делаем именно это в наших приложениях, и это прекрасно работает. Это бесплатное приложение, которое вы можете обновить до полной версии, и мы храним индикатор обновления в связке ключей. Индикатор обновления - это произвольная строка, которую вы выбираете, но для целей цепочки для ключей он обрабатывается как пароль, то есть значение для 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)