zoukankan      html  css  js  c++  java
  • 简单实现KeyChain实例

    目录结构如下:

    AppDelegate.m

     1 //
     2 //  AppDelegate.m
     3 //  KeyChain
     4 //
     5 //  Created by apple on 14-12-26.
     6 //  Copyright (c) 2014年 ll. All rights reserved.
     7 //
     8 
     9 #import "AppDelegate.h"
    10 
    11 @interface AppDelegate ()
    12 
    13 @end
    14 
    15 @implementation AppDelegate
    16 
    17 
    18 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    19     // Override point for customization after application launch.
    20     ViewController *vc = [[ViewController alloc] init];
    21     self.window.rootViewController = vc;
    22     [self.window makeKeyAndVisible];
    23     return YES;
    24 }
    25 
    26 - (void)applicationWillResignActive:(UIApplication *)application {
    27     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    28     // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    29 }
    30 
    31 - (void)applicationDidEnterBackground:(UIApplication *)application {
    32     // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    33     // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    34 }
    35 
    36 - (void)applicationWillEnterForeground:(UIApplication *)application {
    37     // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    38 }
    39 
    40 - (void)applicationDidBecomeActive:(UIApplication *)application {
    41     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    42 }
    43 
    44 - (void)applicationWillTerminate:(UIApplication *)application {
    45     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    46 }
    47 
    48 @end

    KeyChain.h

     1 //
     2 //  KeyChain.h
     3 //  KeyChain
     4 //
     5 //  Created by apple on 14-12-26.
     6 //  Copyright (c) 2014年 ll. All rights reserved.
     7 //
     8 
     9 #import <Foundation/Foundation.h>
    10 #import <Security/Security.h>
    11 
    12 @interface KeyChain : NSObject
    13 
    14 + (NSMutableDictionary *)newSearchDictionary:(NSString *)identifier;
    15 
    16 + (void)save:(NSString *)service data:(id)data;
    17 
    18 + (id)load:(NSString *)service;
    19 
    20 + (void)delete:(NSString *)service;
    21 
    22 @end

    KeyChain.m

     1 //
     2 //  KeyChain.m
     3 //  KeyChain
     4 //
     5 //  Created by apple on 14-12-26.
     6 //  Copyright (c) 2014年 ll. All rights reserved.
     7 //
     8 /**
     9  *__bridge_transfer , __bridge_retained c和oc类型之间转换,,可统一使用__bridge替换
    10  */
    11 #import "KeyChain.h"
    12 static NSString *serviceName = @"com.mycompany.myAppServiceName";
    13 
    14 @implementation KeyChain
    15 
    16 + (NSMutableDictionary *)newSearchDictionary:(NSString *)identifier
    17 {
    18     
    19     NSMutableDictionary * searchDictionary = [[NSMutableDictionary alloc] init];
    20     NSData *encodeInditifier = [identifier dataUsingEncoding:NSUTF8StringEncoding];
    21     [searchDictionary setObject:(__bridge_transfer id)kSecClassGenericPassword
    22                          forKey:(__bridge_transfer id)kSecClass];
    23     [searchDictionary setObject:encodeInditifier forKey:(__bridge_transfer id)kSecAttrGeneric];
    24     [searchDictionary setObject:encodeInditifier forKey:(__bridge_transfer id)kSecAttrAccount];
    25     [searchDictionary setObject:(__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock
    26                          forKey:(__bridge_transfer id)kSecAttrAccessible];
    27     
    28     //[searchDictionary setObject:serviceName forKey:(__bridge id)kSecAttrService];
    29     
    30     return searchDictionary;
    31 }
    32 
    33 +(void)save:(NSString *)service data:(id)data
    34 {
    35     NSMutableDictionary *keyChainQuery = [self newSearchDictionary:service];
    36     /**
    37      *  delete old
    38      */
    39     SecItemDelete((__bridge_retained CFDictionaryRef)keyChainQuery);
    40     [keyChainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data]
    41                       forKey:(__bridge_transfer id)kSecValueData];
    42     /**
    43      *  add new
    44      */
    45     SecItemAdd((__bridge_retained CFDictionaryRef)keyChainQuery, nil);
    46     
    47 }
    48 
    49 +(id)load:(NSString *)service
    50 {
    51     id ret = nil;
    52     NSMutableDictionary *keyChainQuery = [self newSearchDictionary:service];
    53     [keyChainQuery setObject:(id)kCFBooleanTrue
    54                       forKey:(__bridge_transfer id)kSecReturnData];
    55     [keyChainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne
    56                       forKey:(__bridge_transfer id)kSecMatchLimit];
    57     CFDataRef keyData = NULL;
    58     
    59     if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keyChainQuery, (CFTypeRef*)&keyData) == noErr)
    60     {
    61         ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData*)keyData];
    62     }
    63     
    64 //    if (keyData) {
    65 //        
    66 //        CFRelease(keyData);
    67 //    }
    68 //    
    69     
    70     return ret;
    71 }
    72 
    73 +(void)delete:(NSString *)service
    74 {
    75     NSMutableDictionary *keyChainQuery = [self newSearchDictionary:service];
    76     
    77     SecItemDelete((__bridge_retained CFDictionaryRef)keyChainQuery);
    78     
    79 }
    80 
    81 
    82 @end

    ViewController.h

     1 //
     2 //  ViewController.h
     3 //  KeyChain
     4 //
     5 //  Created by apple on 14-12-26.
     6 //  Copyright (c) 2014年 ll. All rights reserved.
     7 //
     8 
     9 #import <UIKit/UIKit.h>
    10 #import "KeyChain.h"
    11 
    12 @interface ViewController : UIViewController
    13 
    14 + (void)savePassWord:(NSString *)password;
    15 
    16 + (id)readPassWord;
    17 
    18 + (void)deletePassWord;
    19 
    20 
    21 @end

    ViewController.m

      1 //
      2 //  ViewController.m
      3 //  KeyChain
      4 //
      5 //  Created by apple on 14-12-26.
      6 //  Copyright (c) 2014年 ll. All rights reserved.
      7 //
      8 
      9 #import "ViewController.h"
     10 static NSString * const KEY_IN_KEYCHAIN = @"com.wuqian.app.allinfo";// 字典在keychain中的key
     11 static NSString * const KEY_PASSWORD = @"com.wuqian.app.password"; //  密码在字典中的key
     12 
     13 @interface ViewController ()
     14 {
     15     UITextField * _field; // 输入密码
     16     UILabel *_psw;        // 显示密码
     17 }
     18 
     19 @end
     20 
     21 @implementation ViewController
     22 
     23 - (void)viewDidLoad {
     24     [super viewDidLoad];
     25     
     26     self.view.backgroundColor = [UIColor whiteColor];
     27     
     28     UILabel * labelName = [[UILabel alloc] initWithFrame:CGRectMake(0, 30, 100, 30)];
     29     labelName.text = @"密码是:";
     30     
     31     
     32     _field = [[UITextField alloc] initWithFrame:CGRectMake(100, 80, 200, 30)];
     33     _field.placeholder = @"请输入密码";
     34     _field.borderStyle = UITextBorderStyleRoundedRect;
     35     
     36     _psw = [[UILabel alloc] initWithFrame:CGRectMake(100, 30, 200, 30)];
     37     _psw.backgroundColor = [UIColor yellowColor];
     38 
     39     UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
     40     btn.frame =CGRectMake(100, 160, 200, 30);
     41     btn.backgroundColor = [UIColor colorWithRed:0 green:0.4 blue:0.1 alpha:0.8];
     42     btn.tintColor = [UIColor redColor];
     43     [btn setTitle:@"submit" forState:UIControlStateNormal];
     44     //[btn setTitle:@"正在提交" forState:UIControlStateSelected];
    //btn.layer.cornerRadius=8; 圆角
        //btn.layer.masksToBounds = YES;
       //btn.layer.borderWidth = 5;
        //btn.layer.borderColor=(__bridge CGColorRef)([UIColor redColor]);
    45 46 [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside]; 47 // UIGestureRecognizer *tap = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)]; 48 // [self.view addGestureRecognizer:tap]; 49 50 51 52 [self.view addSubview:btn]; 53 [self.view addSubview:_field]; 54 [self.view addSubview:labelName]; 55 [self.view addSubview:_psw]; 56 // Do any additional setup after loading the view, typically from a nib. 57 } 58 59 - (void)didReceiveMemoryWarning { 60 [super didReceiveMemoryWarning]; 61 // Dispose of any resources that can be recreated. 62 } 63 //- (void)tap:(UIGestureRecognizer*)gr 64 //{ 65 // 66 // 67 // [_field resignFirstResponder]; 68 //} 69 70 - (void)btnClick:(id)sender 71 { 72 [ViewController savePassWord:_field.text]; 73 _psw.text = [ViewController readPassWord]; 74 75 if (![_field isExclusiveTouch]) { 76 //Setting this property to YES causes the receiver to block the delivery of touch events to other views in the same window. The default value of this property is NO. 77 [_field resignFirstResponder];// 收回键盘 78 79 } 80 81 } 82 83 + (void)savePassWord:(NSString *)password 84 { 85 NSMutableDictionary *usernamepasswordKVPairs = [[NSMutableDictionary alloc] init]; 86 [usernamepasswordKVPairs setObject:password forKey:KEY_PASSWORD]; 87 [KeyChain save:KEY_IN_KEYCHAIN data:usernamepasswordKVPairs]; 88 } 89 90 + (id)readPassWord 91 { 92 NSMutableDictionary *usernamepasswordKVPairs = (NSMutableDictionary *)[KeyChain load:KEY_IN_KEYCHAIN]; 93 94 return [usernamepasswordKVPairs objectForKey:KEY_PASSWORD]; 95 96 } 97 98 + (void)deletePassWord 99 { 100 [KeyChain delete:KEY_IN_KEYCHAIN]; 101 102 } 103 104 @end

    运行效果:

     
     
     
  • 相关阅读:
    那是什么进程 —— svchost.exe是什么? 它为何运行?
    共享一下我的博客皮肤
    C#3.0亮点 —— 关键字var和匿名类型
    改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)
    C#3.0亮点 —— 分部方法
    解决C#中一个"异步方法却同步执行"的问题
    改善代码设计 —— 简化函数调用(Making Method Calls Simpler)
    改善代码设计 —— 总结篇(Summary)
    理解A*寻路算法具体过程
    改善代码设计 —— 组织好你的数据(Composing Data)
  • 原文地址:https://www.cnblogs.com/liuziyu/p/4191332.html
Copyright © 2011-2022 走看看