利用鑰匙串存儲(chǔ)賬號(hào)信息

如何利用鑰匙串存儲(chǔ)App的賬號(hào)信息,廢話不多說直接上代碼

.h

@interface PRZKeychainTool : NSObject
/**
*  儲(chǔ)存字符串到??鑰匙串
*
*  @param sValue 對(duì)應(yīng)的Value
*  @param sKey   對(duì)應(yīng)的Key
*/
+ (void)saveKeychainValue:(NSString *)sValue key:(NSString *)sKey;

/**
*  從??鑰匙串獲取字符串
*
*  @param sKey 對(duì)應(yīng)的Key
*
*  @return 返回儲(chǔ)存的Value
*/
+ (NSString *)readKeychainValue:(NSString *)sKey;

/**
*  從??鑰匙串刪除字符串
*
*  @param sKey 對(duì)應(yīng)的Key
*/
+ (void)deleteKeychainValue:(NSString *)sKey;
@end 

.m

@implementation PRZKeychainTool

+ (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];
}

// 儲(chǔ)存字符串到??鑰匙串
+ (void)saveKeychainValue:(NSString *)sValue key:(NSString *)sKey{
    NSMutableDictionary * keychainQuery = [self getKeychainQuery:sKey];
    SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
    
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:sValue] forKey:(__bridge_transfer id)kSecValueData];
    
    SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
}

// 從??鑰匙串獲取字符串
+ (NSString *)readKeychainValue:(NSString *)sKey
{
    NSString *ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:sKey];
    [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 CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = (NSString *)[NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", sKey, e);
        } @finally {
        }
    }
    if (keyData)
        CFRelease(keyData);
    return ret;
}

//  從??鑰匙串刪除字符串
+ (void)deleteKeychainValue:(NSString *)sKey {
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:sKey];
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
}

@end

使用

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *oneTF;

@property (weak, nonatomic) IBOutlet UITextField *twoTF;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

//讀取
- (IBAction)duqu:(id)sender {
    self.oneTF.text = [NSString stringWithFormat:@"讀取到用戶名:%@",[PRZKeychainTool readKeychainValue:@"uaneName"]];
    self.twoTF.text = [NSString stringWithFormat:@"讀取到用密碼:%@",[PRZKeychainTool readKeychainValue:@"paw"]];
}

//保存
- (IBAction)baocun:(id)sender {
    [PRZKeychainTool saveKeychainValue:self.oneTF.text key:@"uaneName"];
    [PRZKeychainTool saveKeychainValue:self.twoTF.text key:@"paw"];
}

//刪除
- (IBAction)shanchu:(id)sender {
    [PRZKeychainTool deleteKeychainValue:@"uaneName"];
    [PRZKeychainTool deleteKeychainValue:@"paw"];
}

![Uploading 645977-20151224142516359-146623890_193643.png . . .]##一、APP對(duì)鑰匙串的訪問權(quán)限:
(1)未對(duì)應(yīng)用APP的entitlement(授權(quán))進(jìn)行配置時(shí),APP使用鑰匙串存儲(chǔ)時(shí),會(huì)默認(rèn)存儲(chǔ)在自身BundleID的條目下。

645977-20151224142516359-146623890.png

參考鏈接

本人新手呆鳥,忘各位老司機(jī)多多鞭策,使我快速成長(zhǎng)。謝啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 很多時(shí)候我們會(huì)發(fā)現(xiàn)一些iOS應(yīng)用(例如:facebook,whatsap)即使我們卸載重裝它仍然能夠記住我們的賬...
    liangZhen閱讀 10,721評(píng)論 2 4
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評(píng)論 25 709
  • keychain app官方鏈接 重要的事情說三遍 使用keychain group的時(shí)候,測(cè)試一定要使用真機(jī)! ...
    Rxiaobing閱讀 3,347評(píng)論 1 5
  • 前面總結(jié)了創(chuàng)建對(duì)象的幾種方式,本文將再總結(jié)一些實(shí)現(xiàn)繼承的方式。無論是創(chuàng)建對(duì)象,還是繼承,都離不開一個(gè)東西:原型。首...
    柏丘君閱讀 383評(píng)論 0 0
  • 表面上看起來大大咧咧的人內(nèi)心都是比較脆弱敏感的,也就是俗話說的“玻璃心”。 最近的我好像越來越脆弱了,不敢也不知是...
    苗青_三月閱讀 521評(píng)論 0 1

友情鏈接更多精彩內(nèi)容