当前位置:  开发笔记 > 编程语言 > 正文

我可以访问iPhone上的钥匙串吗?

如何解决《我可以访问iPhone上的钥匙串吗?》经验,为你挑选了5个好方法。

这个问题讨论使用crypt()函数在iPhone上加密数据.作为替代方案,iPhone上是否有钥匙串,如果有,我会使用什么代码来存储登录详细信息,然后在应用程序中为我们检索它们?



1> Ben Gottlieb..:

另外需要注意的一点是:当使用iPhone SDK的旧版本(2.x,3.x)时,钥匙串API在模拟器中不起作用.在测试时,这可以为您节省很多挫折!



2> 小智..:

您可以使用钥匙链 - 对于代码,最好的办法是查看Apple的GenericKeychain示例应用程序:

GenericKeychain示例



3> bbrown..:

我非常喜欢Buzz Anderson的Keychain抽象层,我热切期待着Jens Alfke的MYCrypto达到一个可用的状态.后者可以使用相同的代码在Mac OS X和iPhone上使用,但其功能仅模仿Keychain的一小部分.



4> AlBeebe..:

这是我用来存储钥匙串中的键/值对.确保将Security.framework添加到项目中

#import 

// -------------------------------------------------------------------------
-(NSString *)getSecureValueForKey:(NSString *)key {
    /*

     Return a value from the keychain

     */

    // Retrieve a value from the keychain
    NSDictionary *result;
    NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecReturnAttributes, nil] autorelease];
    NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, kCFBooleanTrue, nil] autorelease];
    NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys];

    // Check if the value was found
    OSStatus status = SecItemCopyMatching((CFDictionaryRef) query, (CFTypeRef *) &result);
    [query release];
    if (status != noErr) {
        // Value not found
        return nil;
    } else {
        // Value was found so return it
        NSString *value = (NSString *) [result objectForKey: (NSString *) kSecAttrGeneric];
        return value;
    }
}




// -------------------------------------------------------------------------
-(bool)storeSecureValue:(NSString *)value forKey:(NSString *)key {
    /*

     Store a value in the keychain

     */

    // Get the existing value for the key
    NSString *existingValue = [self getSecureValueForKey:key];

    // Check if a value already exists for this key
    OSStatus status;
    if (existingValue) {
        // Value already exists, so update it
        NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, nil] autorelease];
        NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, nil] autorelease];
        NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease];
        status = SecItemUpdate((CFDictionaryRef) query, (CFDictionaryRef) [NSDictionary dictionaryWithObject:value forKey: (NSString *) kSecAttrGeneric]);
    } else {
        // Value does not exist, so add it
        NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecAttrGeneric, nil] autorelease];
        NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, value, nil] autorelease];
        NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease];
        status = SecItemAdd((CFDictionaryRef) query, NULL);
    }

    // Check if the value was stored
    if (status != noErr) {
        // Value was not stored
        return false;
    } else {
        // Value was stored
        return true;
    }
}

值得注意的是,如果用户删除您的应用,则不会删除这些键/值.如果用户删除了您的应用,然后重新安装,则仍可以访问键/值.


Selector getSecureValueForKey中存在一个错误:当您返回该值时,它已经被释放.由"[结果发布]"发布

5> whoisjake..:

还要记住,在生成AppID时,如果您希望多个应用程序访问相同的Keychain信息,则必须生成通配符AppID(#####.com.prefix.*)...

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有