iOS keychain存储数据

本文介绍如何利用iOS的Keychain服务进行数据持久化存储,确保即使在应用被卸载后,敏感信息如密码等仍能保留。通过Objective-C实现,提供了存储、读取及删除密钥链中数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iOS存储数据一般在删除APP之后,所有数据就都跟着没有了,但是iOS也提供了一个可以在删除APP之后,数据还在的保存方式,那就是keychain存储

具体使用如下:

iOS存储数据一般在删除APP之后,所有数据就都跟着没有了,但是iOS也提供了一个可以在删除APP之后,数据还在的保存方式,那就是keychain存储

具体使用如下:


#import <Foundation/Foundation.h>


@interface YFKeychainTool : NSObject

  // 储存字符串到钥匙串

+ (void)saveKeychainValue:(id)sValue key:(NSString *)sKey;



  //从钥匙串获取字符串

+ (id)readKeychainValue:(NSString *)sKey;



 //从钥匙串删除字符串

+ (void)deleteKeychainValue:(NSString *)sKey;


@end




#import "YFKeychainTool.h"


@implementation YFKeychainTool

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service{

    return [NSMutableDictionary dictionaryWithObjectsAndKeys:

            (__bridge_transfer id)kSecClassGenericPassword,

            (__bridge_transfer id)kSecClass,service,

            (__bridge_transfer id)kSecAttrService,service,

            (__bridge_transfer id)kSecAttrAccount,

            (__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,

            (__bridge_transfer id)kSecAttrAccessible,

            nil];

}


+ (void)saveKeychainValue:(id)sValue key:(NSString *)sKey{

    NSMutableDictionary * keychainQuery = [self getKeychainQuery:sKey];

    SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);

    

    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:sValue] forKey:(__bridge_transfer id)kSecValueData];

    

    SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);

    

}


+ (id)readKeychainValue:(NSString *)sKey

{

    NSString *ret = nil;

    NSMutableDictionary *keychainQuery = [self getKeychainQuery:sKey];

    [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 CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {

        @try {

            ret = (NSString *)[NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];

        } @catch (NSException *e) {

            NSLog(@"Unarchive of %@ failed: %@", sKey, e);

        } @finally {

        }

    }

    if (keyData)

        CFRelease(keyData);

    return ret;

}

+ (void)deleteKeychainValue:(NSString *)sKey {

    NSMutableDictionary *keychainQuery = [self getKeychainQuery:sKey];

    SecItemDelete((__bridge CFDictionaryRef)keychainQuery);

}

@end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值