如何清空所有Keychain及UserDefaults

栏目: IOS · 发布时间: 6年前

内容简介:我们经常会使用Keychain和UserDefaults来存储iOS App数据。Keychain是iOS设备中的一个安全的存储容器,可以用来为应用保存敏感信息比如用户名,密码,网络密码,认证令牌。在删掉应用后,Keychain中的数据也会保留,用户再次安装的App还能从Keychain中读取到数据。所以Keychain中保存的数据一般都是比较重要,并且不希望卸载应用后就被删除的数据,比如用户的登录信息,wifi密码等。我们常用的OpenUDID库就是使用Keychain的这个特性来获取唯一性的设备ID,

我们经常会使用Keychain和UserDefaults来存储iOS App数据。

Keychain是iOS设备中的一个安全的存储容器,可以用来为应用保存敏感信息比如用户名,密码,网络密码,认证令牌。在删掉应用后,Keychain中的数据也会保留,用户再次安装的App还能从Keychain中读取到数据。所以Keychain中保存的数据一般都是比较重要,并且不希望卸载应用后就被删除的数据,比如用户的登录信息,wifi密码等。我们常用的OpenUDID库就是使用Keychain的这个特性来获取唯一性的设备ID,具体做法是,生成一个UUID,或者是获取广告标识符,然后存入Keychain,这样删除应用后再次安装应用也还能读取到上一次生成的设备标识符。

UserDefaults是iOS设备上一个Key-Value的存储容器,最终数据会以plist文件的形式存在文件夹Library/Preferences下面。默认的UserDefaults的文件名是bundle identitier加上.plist的后缀名。UserDefaulst会随App的删除而被清除(也可以同步到iCloud上),所以UserDefaults存储着一些可以再生的的数据。

大部分时候,我们都会使用Keychain或者UserDefaults来存储一些App登录用户相关的数据,或者服务器的token等,可以很方便的实现App启动自登录的功能;但是这个对于测试来说就比较头疼,尤其是存储到Keychain里的不能删除的数据,而要模仿一个全新的从没有安装过我们应用的App的时候,必须要清除掉保存的Keychain。

如何清空Keychain

清空Keychain的思路很简单,就是遍历keychain中存储的数据,然后挨个删除。代码如下:

- (void)clearKeyChain {
    NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                  (__bridge id)kCFBooleanTrue, (__bridge id)kSecReturnAttributes,
                                  (__bridge id)kSecMatchLimitAll, (__bridge id)kSecMatchLimit,
                                  nil];
    NSArray *secItemClasses = [NSArray arrayWithObjects:
                               (__bridge id)kSecClassGenericPassword,
                               (__bridge id)kSecClassInternetPassword,
                               (__bridge id)kSecClassCertificate,
                               (__bridge id)kSecClassKey,
                               (__bridge id)kSecClassIdentity,
                               nil];
    for (id secItemClass in secItemClasses) {
        [query setObject:secItemClass forKey:(__bridge id)kSecClass];
        
        CFTypeRef result = NULL;
        SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);
        if (result != NULL) CFRelease(result);
        
        NSDictionary *spec = @{(__bridge id)kSecClass: secItemClass};
        SecItemDelete((__bridge CFDictionaryRef)spec);
    }
}

如何清空UserDefaults

清空默认的UserDefaults,这个有相应的接口可以调用。直接调用即可。

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];

然而,UserDefaults可以自己通过[NSUserDefaults initWithSuiteName:]方法生成一个plist文件,要清除自己生成的UserDefaulst文件,必须要知道suiteName,而suiteName可以通过遍历Preferences文件夹中的plist文件就可以知道。完整代码如下:

- (void)clearUserDefaults {
    NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    NSString *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject;
    path = [path stringByAppendingPathComponent:@"Preferences"];
    NSArray *fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
    
    for (NSString * filename in fileList) {
        NSString *filepath = [path stringByAppendingPathComponent:filename];
        BOOL isDir = NO;
        [[NSFileManager defaultManager] fileExistsAtPath:filepath isDirectory:(&isDir)];
        if (!isDir && [filename hasSuffix:@".plist"] && (![filename isEqualToString:appDomain])) {
            NSString *suitename = [filename stringByDeletingPathExtension];
            NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:suitename];
            [userDefaults removePersistentDomainForName:suiteName];
            [[NSFileManager defaultManager] removeItemAtPath:filepath error:nil];
        }
    }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

神经网络与机器学习(原书第3版)

神经网络与机器学习(原书第3版)

[加] Simon Haykin / 申富饶、徐烨、郑俊、晁静 / 机械工业出版社 / 2011-3 / 79.00元

神经网络是计算智能和机器学习的重要分支,在诸多领域都取得了很大的成功。在众多神经网络著作中,影响最为广泛的是Simon Haykin的《神经网络原理》(第3版更名为《神经网络与机器学习》)。在本书中,作者结合近年来神经网络和机器学习的最新进展,从理论和实际应用出发,全面、系统地介绍了神经网络的基本模型、方法和技术,并将神经网络和机器学习有机地结合在一起。 本书不但注重对数学分析方法和理论的探......一起来看看 《神经网络与机器学习(原书第3版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码