利用KeyChain共享数据(唯一标示)
下载KeychainItemWrapper
官方demo
https://developer.apple.com/library/ios/samplecode/GenericKeychain/GenericKeychain.zip导入KeychainItemWrapper
在项目中导入KeychainItemWrapper,添加Security.framework库。设置KeychainItemWrapper为非arc
TARGETS —> Build Phases —> Compile Sources
标记KeychainItemWrapper为:-fno-objc-arc
添加配置
添加配置有两种,可以添加plist文件或者添加entitlements文件。
- 添加plist文件
以下为官方demo的plist详情:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>keychain-access-groups</key>
<array>
<string>YOUR_APP_ID_HERE.com.yourcompany.GenericKeychain</string>
<string>YOUR_APP_ID_HERE.com.yourcompany.GenericKeychainSuite</string>
</array>
</dict>
</plist>
可从官方demo中看出内容格式为
YOUR_APP_ID_HERE.com.yourcompany.GenericKeychain
例如:$(AppIdentifierPrefix)com.yourcompany.xxx
配置多个可在这些APP中共享数据。
TARGETS —> Build Settings —> Code Signing Entitlements
配置Entitlements:$(SRCROOT)/plist在项目中绝对位置/xxxx.plist
例如:$(SRCROOT)/keychain/KeychainAccessGroups.plist
- 添加entitlements文件
TARGETS —> Capabilities —> Keychain Sharing
设置Keychain Sharing状态为on
添加Keychain Groups:com.yourcompany.xxx
设置唯一标示
假设以IDFV作为标示,利用KeyChain可以保证卸载以后仍是原IDFV,实现唯一标示。
可以实现多APP使用统一唯一标示。
发现KeychainItemWrapper默认初始化的类型为NSDictionary,故改为使用NSDictionary。
+(NSString *)getIDFV
{
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"IDFV" accessGroup:nil];
id dicIDFV = [keychainItem objectForKey:(id)CFBridgingRelease(kSecValueData)];
if (![dicIDFV isKindOfClass:[NSDictionary class]] && !dicIDFV[@"IDFV"]) {
NSString *strIDFV = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
dicIDFV = [NSDictionary dictionaryWithObject:strIDFV forKey:@"IDFV"];
[keychainItem setObject:dicIDFV forKey:(id)CFBridgingRelease(kSecValueData)];
}
return dicIDFV[@"IDFV"];
}