最近使用百度发现iOS,只要登录了一个百度APP,其他APP自动登录,于是就查阅资料了解缘由

来源:互联网 发布:python三本经典书籍 编辑:程序博客网 时间:2024/05/16 13:42

   最近使用百度发现iOS,只要登录了一个百度APP,其他百度APP自动登录,于是就查阅资料了解缘由,原来使用了Keychain,查阅的使用案例代码如下:


@implementation WQKeyChain+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {return [NSMutableDictionary dictionaryWithObjectsAndKeys:        (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass,        service, (__bridge_transfer id)kSecAttrService,        service, (__bridge_transfer id)kSecAttrAccount,        (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,(__bridge_transfer id)kSecAttrAccessible,        nil];}+ (void)save:(NSString *)service data:(id)data {    //Get search dictionary    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];    //Delete old item before add new item    SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);    //Add new object to search dictionary(Attention:the data format)    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];    //Add item to keychain with the search dictionary    SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);}+ (id)load:(NSString *)service {    id ret = nil;    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];    //Configure the search setting    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];    [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];    CFDataRef keyData = NULL;    if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {        @try {            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];        } @catch (NSException *e) {            NSLog(@"Unarchive of %@ failed: %@", service, e);        } @finally {        }    }    return ret;}+ (void)delete:(NSString *)service {    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];    SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);}@end


保存密码

@interface WQUserDataManager : NSObject/** *    @brief    存储密码 * *    @param     password     密码内容 */+(void)savePassWord:(NSString *)password;/** *    @brief    读取密码 * *    @return    密码内容 */+(id)readPassWord;/** *    @brief    删除密码数据 */+(void)deletePassWord;@end

#import "WQUserDataManager.h"@implementation WQUserDataManagerstatic NSString * const KEY_IN_KEYCHAIN = @"com.wuqian.app.allinfo";static NSString * const KEY_PASSWORD = @"com.wuqian.app.password";+(void)savePassWord:(NSString *)password{    NSMutableDictionary *usernamepasswordKVPairs = [NSMutableDictionary dictionary];    [usernamepasswordKVPairs setObject:password forKey:KEY_PASSWORD];    [WQKeyChain save:KEY_IN_KEYCHAIN data:usernamepasswordKVPairs];}+(id)readPassWord{    NSMutableDictionary *usernamepasswordKVPair = (NSMutableDictionary *)[WQKeyChain load:KEY_IN_KEYCHAIN];    return [usernamepasswordKVPair objectForKey:KEY_PASSWORD];}+(void)deletePassWord{    [WQKeyChain delete:KEY_IN_KEYCHAIN];}@end


0 0