zoukankan      html  css  js  c++  java
  • 将数据保存在系统钥匙串里,即使应用被删除,数据还会被保存

    @interface SaveObject : NSObject

    // 保存数据

    + (void)save:(NSString *)key data:(id)data;

    // 加载数据

    + (id)load:(NSString *)key;

    // 删除数据

    + (void)delete:(NSString *)key;

    @end

    @implementation SaveObject

    // 获取数据

    + (NSMutableDictionary *)keychainQuery:(NSString *)key

    {

        if (key) {

            return [NSMutableDictionary dictionaryWithObjectsAndKeys:

                    (__bridge_transfer id)kSecClassGenericPassword, (__bridge_transfer id)kSecClass,

                    key, (__bridge_transfer id)kSecAttrService,

                    key, (__bridge_transfer id)kSecAttrAccount,

                    (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock, (__bridge_transfer id)kSecAttrAccessible,

                    nil];

        }

        return nil;

    }

    // 保存数据

    + (void)save:(NSString *)key data:(id)data

    {

        if (key && data != nil) {

            //Get search dictionary

            NSMutableDictionary *keychainQuery = [self keychainQuery:key];

            //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 *)key

    {

        id ret = nil;

        if (key) {

            NSMutableDictionary *keychainQuery = [self keychainQuery:key];

            //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: %@", key, e);

                }

                @finally {}

            }

        }

        return ret;

    }

    // 删除数据

    + (void)delete:(NSString *)key

    {

        NSMutableDictionary *keychainQuery = [self keychainQuery:key];

        SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);

    }

     @end

  • 相关阅读:
    重拾Ajax
    和transformjs一起摇摆
    CSS/JS图片鼠标悬浮一道光闪过
    深究JS异步编程模型
    Vue.js组件
    并行计算基础&编程模型与工具
    Oracle442个应用场景------------基础应用场景
    消息摘要算法-HMAC算法
    linux上网络配置不生效的怪异现象处理
    Eclipse 将projectBuild Path中引用的jar包自己主动复制到WEB-INF下的lib目录下
  • 原文地址:https://www.cnblogs.com/wudan7/p/3963314.html
Copyright © 2011-2022 走看看