前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS常用的数据存储方式

iOS常用的数据存储方式

作者头像
公众号iOS逆向
发布2021-07-05 20:57:27
1.9K0
发布2021-07-05 20:57:27
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全
  • 1.1 目录结构分析
  • 1.2 应用沙盒目录的获取方式
  • 1.3 偏好设置(standardUserDefaults 的使用)
  • 1.4 存储自定义类型对象到NSUserDefaults
  • 2.1 什么是Keychain?
  • 2.2 案例:存储UUID来解决设备唯一标识符获取方案
  • 2.3 iOS安全之敏感逻辑的保护方案
  • 4.1 例子:存储自定义类型
  • 4.2 NS_DESIGNATED_INITIALIZER 宏的使用
  • 4.3 归档NSArray
  • 5.1 FMDB例子
  • 5.2 例子2:利用NSData归档2个Person对象到同一文件中
  • 5.3 例子3:利用NSData实现深copy
  • 6.1 基本用法
  • 6.2 数据库缓存性能进行优化
  • 7.1、模型文件
  • 7.2、NSManagedObject
  • 7.3、coredata 主要对象
  • 7.4、搭建coredate上下文
  • 7.5、添加数据
  • 7.6、查询数据
  • 7.7、删除数据
  • 7.8、打开coredata的sql日志输出 开关
  • 7.9、coredata 的延迟加载
  • 7.10、NSManagedObject子类

前言

iOS应用数据存储的常用方式

1、preference偏好设置 2、XML属性列表归档(plist) 3、使用Keychain 存储,例如存储UUID来解决设备唯一标识符获取方案 4、NSKeyedArchiver归档(NSCoding) 5、SQLite3 6、Core Data 7、第三方库:BGFMDB的使用

原文地址

https://kunnan.blog.csdn.net/article/details/74058857

I 、应用沙盒


每个iOS应用都有自己的应用沙盒,来与其他文件系统隔离。

1.1 目录结构分析

1、应用程序包

(上图中的Layer)包含了所有的资源文件和可执行文件

2、Documents

保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录

3、tmp:

保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录

4、Library/Caches:

保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据

5 Library/Preference:

保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录

1.2 应用沙盒目录的获取方式

tmp:

代码语言:javascript
复制
FOUNDATION_EXPORT NSString *NSTemporaryDirectory(void);

沙盒根目录:

代码语言:javascript
复制
FOUNDATION_EXPORT NSString *NSHomeDirectory(void);
NSLog(@"%@",NSHomeDirectory());//: /Users/devzkn/Library/Developer/CoreSimulator/Devices/5A6E02FF-A156-455B-AE43-C207F4E7FBC4/data/Containers/Data/Application/E3F77B8B-C88C-4577-A943-187151AB19CC



Documents:(2种方式)
方式1:
```objectivec
NSString *home = NSHomeDirectory();
NSString *documents = [home stringByAppendingPathComponent:@"Documents"];
// 不建议采用,因为新版本的操作系统可能会修改目录名

方式2:

代码语言:javascript
复制
//FOUNDATION_EXPORT NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);

// NSUserDomainMask 代表从用户文件夹下找
// YES 代表展开路径中的波浪字符“~”
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, NO);~/Documents/data.plist,yes的话,就展开全路径
// 在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素
NSString *documents = [array objectAtIndex:0];

Library/Caches (类似Documents)

Library/Preference

通过NSUserDefaults类存取该目录下的设置信息

1.3 偏好设置(standardUserDefaults 的使用)

针对应用的字体大小、是否保存用户名等偏好设置,IOS的每个应用都有个NSUserDefaults实例,通过它来存取偏好设置。NSUserDefaults设置数据的时候,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。

出现以上问题,可以通过调用synchornize方法强制写入

代码语言:javascript
复制
- (BOOL)synchronize;

偏好设置的好处

1、不用关心文件名 2、快速的进行键值对存储

  • 偏好设置的工具方法

代码语言:javascript
复制
+ (void)setObject:(id)value forKey:(NSString *)key{
    [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];
}
+ (id)objectForKey:(NSString *)key{
    return [[NSUserDefaults standardUserDefaults] objectForKey:key];
}
  • 例子:是否展示过版本新特性,也即是引导页

代码语言:javascript
复制
-(void)setBShowIntroduce:(BOOL)bShowIntroduce
{
    //    [SessionMgr Instance].strOrderAmount = bShowIntroduce;
    
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:bShowIntroduce] forKey:@"bShowIntroduce"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}


/**
 此版本是否提示过文案
 
 */
-(BOOL)bShowIntroduce
{
    //    return [SessionMgr Instance].strOrderAmount;
    
    NSNumber *numShowIntroduce = [[NSUserDefaults standardUserDefaults] objectForKey: @"bShowIntroduce"];
    
    return [numShowIntroduce boolValue];
}

1.4 存储自定义类型对象到NSUserDefaults

自定义的类型需要转成NSData再存

setObject

代码语言:javascript
复制
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:model];
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:ModelKey];

unarchiveObjectWithData

代码语言:javascript
复制
   NSData *data = [[NSUserDefaults standardUserDefaults] forKey:ModelKey];
    
    [Session shareSession].model= [NSKeyedUnarchiver unarchiveObjectWithData:data];

———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/z929118967/article/details/77387782

II、使用Keychain 存储

2.1 什么是Keychain?

Keychain是OS X和iOS都提供的一种安全存储敏感信息工具。

比如,我们可以在Keychain中存储用户名、密码等信息。

Keychain的安全机制从系统层面保证了存储的敏感信息不会被非法读取或者窃取。

Keychain的特点如下:

1、保存在Keychain中的数据,即使应用程序被卸载,数据仍然存在;重新安装应用程序,我们也可以从Keychain中读取这些数据。 2、Keychain中的数据可以通过Group的方式实现应用程序之间共享,只要应用程序具有相同的TeamID即可。 3、保存在Keychain中的数据都是经过加密的,因此非常安全。

———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/z929118967/article/details/115860229

2.2 案例:存储UUID来解决设备唯一标识符获取方案

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • I 、应用沙盒
    • 1.1 目录结构分析
      • 1.2 应用沙盒目录的获取方式
        • 1.3 偏好设置(standardUserDefaults 的使用)
          • 1.4 存储自定义类型对象到NSUserDefaults
          • II、使用Keychain 存储
            • 2.1 什么是Keychain?
              • 2.2 案例:存储UUID来解决设备唯一标识符获取方案
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档