将数据保存在系统钥匙串里,即使应用被删除,数据还会被保存

@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

时间: 2025-01-10 12:06:33

将数据保存在系统钥匙串里,即使应用被删除,数据还会被保存的相关文章

如果第三方数据表与系统数据库里的表名格式不一致的解决方案

namespace Model; use Think\Model; class QqModel extends Model{//这两种方法都可以解决 // protected $trueTableName = 'tencent_qq'; protected $tablePrefix = 'tencent_'; }

ASP.NET MVC4 新手入门教程特别篇之一----Code First Migrations更新数据库结构(数据迁移)修改Entity FrameWork 数据结构(不删除数据)

背景 code first起初当修改model后,要持久化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会产生一个问题,当我们的旧数据库中包含一些测试数据时,当持久化更新后,原数据将全部丢失,故我们可以引入EF的数据迁移功能来完成. 要求 已安装NuGet 过程示例 原model using System; using System.Collections.Generic; using System.Linq; using

activeMQ数据消费了,但是在中间站却没有删除数据的原因

connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); 第一个参数当改成TRUE后,就会出现消费了数据在MQ中间站却没有删除记录的情况

大数据、云计算系统顶级架构师课程学习视频

本课程为大数据.云计算系统架构师高级培训课程,授课模式为线上视频+直播答疑,本套教程2000多节课,里面的hadoop.spark都是新版本 6个阶段共31部分:1.Linux基础2.大数据基础Hadoop 2.X3.大数据仓库Hive4.大数据协作框架5.分布式数据库HBase6.Storm流计算从入门到精通之技术篇7.Scala语言从入门到精通8.内存计算框架Spark9.Spark深入剖析10.企业大数据平台11.驴妈妈旅游网大型离线数据电商分析平台12.Storm流计算之项目篇13.某团

了解如何设计和开发基于Http请求的数据接口服务系统

如今互联网的蓬勃发展离不开Http这个应用层面上的网络通信协议的诞生和发展,在经历着信息技术时代,到现在"数据时代"一词屡见不鲜之后,可以洞悉数据在影响着我们生活,昨晚在下载百度地图的离线数据包就发现,广州市的离线数据包明显大于全国其它市区不少. 数据作为一种服务已成常态,比如:12306火车票查询数据接口,商标信息服务接口,甚至车辆违章高发路段数据接口,这些数据来自各行各业并且通过数据接口服务提供给更多需要的人或信息系统. 本文主要介绍如何设计和开发数据接口服务系统,主要涉及到数据接

php处理登录、添加数据、删除数据和修改数据

php 处理登录 :需要先建一个登录的页面,用form表单就可以很轻松的完成,(这里的示例是我根据数据库现成的表做的 是一个teacher表格 根据老师的工号和姓名登录的) <form action="chuli.php" method="post"> <div> 工号: <input type="text" name="tno"/> </div> <div> 姓名:

arcgis engine删除数据及数据导入速度较快的方法

最近利用arcgis engine开发一款用于审核软件,需要先进行图形库的建立,还有些原始数据经过一些处理形成需要的数据. 代码实现的过程中发现数据进行过处理以后,数据量比较大,几万条的Feature一条条写入sde库速度让人无法忍受.然后在网上查了不少资料,发现多数类似于shape导入sde的时候都是用游标一条条插入的.但是也找到了一个方法,虽然也需要一些时间,但是总体比游标快太多了,记录在此. 1 /// <summary> 2 /// 图层导入数据集 3 /// </summary

MariaDB SQL 更新和删除数据

为了凸显数据库操作的更为重要的主题,以下内容置顶. 更新和删除数据的准则: 不要在执行UPDATE或DELETE时不使用WHERE子句,除非你真的打算更新或删除每一行. 确保每个表都有主键,并且只要有可能都将其用于WHERE子句. 在使用带有WHERE子句的UPDATE或DELETE之前,先用SELECT语句测试,确保过滤除了正确的记录. 在使用数据库时,实施参照完整性以便MariaDB不允许删除那些数据关联其他表中的数据的行. 更新数据 UPDATE customers SET cust_em

再谈删除数据的SQL语句

无论是刚毕业的大学生还是已经在软件领域拼杀多年的老手,只要提及删除数据的SQL语句无人不知无人不晓,再谈删除数据的SQL语句不免显得卖弄,呵呵呵,不要好高骛远: 有如下两个表: 表1: CREATE TABLE `lm_r_user_info` ( `id` CHAR(36) NOT NULL COMMENT '用户基础信息ID', `real_name` VARCHAR(30) NOT NULL COMMENT '真实姓名', `gender` INT(11) DEFAULT NULL COM