Skip to content
利用NSUserDefaults,Keychain,runtime和归档快速存储用户信息,简单粗暴,集成简单.
Branch: master
Clone or download
Latest commit d2b3dba May 8, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
SDUserDefaults 更新keychain存储,安全性更强~ May 8, 2019
SDUserDefaultsDemo.xcodeproj 新增测试类中的keychain初始化方法 May 8, 2019
SDUserDefaultsDemo
.DS_Store
README.md Update README.md May 8, 2019
SDUserDefaults.podspec 修改pod文件,支持keychain存储 May 8, 2019

README.md

所有属性必须遵循NSCoding协议(自定义类可继承于SDCodingObject;Foundation中的基础类已经实现NSCoding协议方法)!!!! 包括数组成员变量以及字典成员变量中的元素!!!!

导入方式

手动导入: 下载演示Demo以及 SDUserDefaults. 把SDUserDefaults文件夹导入你自己的项目合适位置. 使用方法可以看 自定义使用基本使用方式

cocoapod导入方式如下所示,使用方法可看 自定义使用 模块.

   pod 'SDUserDefaults'

然后 pod install


基本使用方式 (导入方式推荐:手动导入)

1.下载演示Demo以及 SDUserDefaults.

2.把SDUserDefaults文件夹导入你自己的项目合适位置,文件夹中主要包含SDUserDefaultsSDCodingObject两个类.

3.在SDUserDefaults的.h文件中添加你想要存储的属性,这里需要注意的是属性必须是遵循NSCoding协议的类,Foundation中的类都已经遵循该协议.如下图所示.

这时候有人会问,那我自定义的类需要怎么办?难道我需要自己实现NSCoding协议中的**- (void)encodeWithCoder- (instancetype)initWithCoder方法吗?完全不需要!你需要继承于SDCodingObject**这个类即可,我在其中都做了NSCoding协议的实现,并且所有的属性都会进行归档操作.例如上图的TestModel类.代码如下所示.

4.存储数据:只需要我们把对应的属性进行赋值,然后调用saveUserInfoAction方法即可.代码如下所示.

    [SDUserDefaults standardUserDefaults].name = @"用户数据";
    TextModel *testModel = [[TextModel alloc] init];
    testModel.name = @"骚栋";
    testModel.age = @(15);
    testModel.location = @"北京";
    [SDUserDefaults standardUserDefaults].testModel = testModel;
    [[SDUserDefaults standardUserDefaults] saveUserInfoAction]; // 存储数据

5.获取数据:直接取值就好,简单粗暴,没有任何问题.代码如下所示.

    /*****获取数据*****/
    NSLog(@"%@",[SDUserDefaults standardUserDefaults].name);
    NSLog(@"%@",[SDUserDefaults standardUserDefaults].testModel.name);
    NSLog(@"%@",[SDUserDefaults standardUserDefaults].testModel.age);
    NSLog(@"%@",[SDUserDefaults standardUserDefaults].testModel.location);

6.删除数据:想要删除数据直接调用deleteUserInfo即可.

    [[SDUserDefaults standardUserDefaults] deleteUserInfo];

7.更新数据:想要删除的话,就把那个属性置为nil,想要修改某个属性就把那个属性修改,最后调用saveUserInfoAction方法保存即可.

    [SDUserDefaults standardUserDefaults].name = @"新的用户数据";
    [SDUserDefaults standardUserDefaults].testModel.location = nil;
    [[SDUserDefaults standardUserDefaults] saveUserInfoAction]; // 更新数据

8.忽略归档属性:不想让部分属性进行归档持久化怎么办?使用 unEncodePropertys 即可.添加忽略的属性名称则该属性不会进行归档操作,注意,要忽略尽量在 saveUserInfoAction前使用吆~

    [SDUserDefaults standardUserDefaults].testModel.unEncodePropertys = @[@"age",@"names"];

SDUserDefaults 自定义使用 (导入方式推荐:手动导入和cocoapods都可)


有很多的童鞋会说,我凭啥要用你的SDUserDefaults来初始化啊,我就想自己写一个UserDefaults单例来管理我自己的存储属性不行啊?

行,当然可以了,在1.0.3版本的时候,骚栋增加了一个新的类,叫做SDUserObject类,只需要你写的单例继承于这个类,并且使用 - (instancetype)initWithIdentifier 方法来初始化,那么依然可以使用强大的属性,但是自己书写的代码量会大大减少.我们来看一下Demo中的例子是如何使用的吧.

基本操作什么的,还是如同上一个模块一样.我们来看一下存储的单例类是定义的.我们需要让单例类继承于SDUserObject类,如下图所示.

然后在创建单例的时候需要使用带有标识符参数的 - (instancetype)initWithIdentifier 方法进行初始化.如下图所示.

然后在保存和删除的方法上使用saveAllPropertyActiondeleteAllPropertyAction 即可.


这里对几个问题做一下解释.

  • 为什么会有SDUserObject类的出现?

答:后期的SDUserDefaults会使用cocoapods进行管理,那么到时候如果通过cocoapods引入的时候不能去改动源码吧,所以我们通过继承于SDUserObject的方式来使用SDUserDefaults这个三方,同时呢,现在手动导入的方式,也会有很多童鞋有这样的自定义类的需求,所以SDUserObject的出现是很有必要的~

  • 为什么在初始化SDUserObject类或者子类的时候需要使用 - (instancetype)initWithIdentifier 这个带有标识符的初始化方法呢?

答:唯一标识符identifier的作用是做了存储的key来使用的.如果有的童鞋写了两个单例类,但是用了相同的identifier就会出现数据错乱问题,所以这里我把这个唯一标识符暴露在.h属性中,用于个别童鞋进行单独的定制.只要保证全局唯一即可.


SDUserDefaults 的Keychain存储


SDUserDefaults 的1.0.0版本是基于NSUserDefaults进行存储的,由于NSUserDefaults是使用的明文plist文件进行存储,所以安全性有一定的欠缺,那么有的童鞋想来个更加安全的存储,是否可以呢?当然了,在1.0.6版本,骚栋对于Keychain存储方式已经做了添加,我们可以使用两种方式来实现Keychain存储方式.

  • 手动导入SDUserDefaults时,我们可以直接修改 SDKeychainUserDefaults 单例,使用方式和 SDUserDefaults 类一致即可.但是 SDKeychainUserDefaults 的存储位置是在Keychain,而不是NSUserDefaults中.

  • cocoapods导入方式只需要使用 initKeychainObjectWithIdentifier: 即可. 如下所示. 可以查看Demo中的TestUserDefaults的初始化方法.


历史版本

  • 1.0.0 SDUserDefaults初次创建

  • 1.0.1 SDUserDefaults对数组中的元素是否遵循NSCoding协议进行的提示完善

  • 1.0.2 添加忽略归档数组unEncodePropertys,可忽略部分属性进行归档操作.

  • 1.0.3 新增SDUserObject类,用于自定义单例类使用.

  • 1.0.5 添加SDUserObject,添加cocoapods导入方式.

  • 1.0.6 添加keychain存储方式,安全性更高!


SDUserDefaults交流反馈QQ群: 214575341

点击查看博客

You can’t perform that action at this time.