SORU
9 Mart 2011, ÇARŞAMBA


Tasarruf e-Posta iOS Anahtarlık için Parola/

Eğer bu acemi bir soru ise kusura bakmayın iOS geliştirme için çok yeniyim. Bir kullanıcının e-posta adresi ve şifre alır uygulamam için basit bir kimlik doğrulama mekanizması var. Ben de yazan bir switch var 'beni Unutma'. Eğer kullanıcı bu geçiş geçiş yapar, bu alanlar otomatik doldurulan gelecekte olabilir, böylece e-posta/parola korumak istiyorum.

Bu plist dosyasına kaydetme ile çalışma fırsatım oldu ama o şifre şifresiz olduğu için iyi bir fikir olmadığını biliyorum. Anahtarlık için kurtarmak için bir kaç örnek kod buldum, ama dürüst olmak gerekirse, biraz kayboldum. Aşağıdaki fonksiyon için, çağrı ve e-posta adresini de kaydetmek değiştirmek için nasıl emin değilim.

Olur Ara tahmin ediyorum: saveString(@"passwordgoeshere");

Herhangi bir yardım için teşekkür ederiz!!!

  (void)saveString:(NSString *)inputString forKey:(NSString *)account {

    NSAssert(account != nil, @"Invalid account");
    NSAssert(inputString != nil, @"Invalid string");

    NSMutableDictionary *query = [NSMutableDictionary dictionary];

    [query setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
    [query setObject:account forKey:(id)kSecAttrAccount];
    [query setObject:(id)kSecAttrAccessibleWhenUnlocked forKey:(id)kSecAttrAccessible];

    OSStatus error = SecItemCopyMatching((CFDictionaryRef)query, NULL);
    if (error == errSecSuccess) {
        // do update
        NSDictionary *attributesToUpdate = [NSDictionary dictionaryWithObject:[inputString dataUsingEncoding:NSUTF8StringEncoding] 
                                                                      forKey:(id)kSecValueData];

        error = SecItemUpdate((CFDictionaryRef)query, (CFDictionaryRef)attributesToUpdate);
        NSAssert1(error == errSecSuccess, @"SecItemUpdate failed: %d", error);
    } else if (error == errSecItemNotFound) {
        // do add
        [query setObject:[inputString dataUsingEncoding:NSUTF8StringEncoding] forKey:(id)kSecValueData];

        error = SecItemAdd((CFDictionaryRef)query, NULL);
        NSAssert1(error == errSecSuccess, @"SecItemAdd failed: %d", error);
    } else {
        NSAssert1(NO, @"SecItemCopyMatching failed: %d", error);
    }
}

CEVAP
9 Mart 2011, ÇARŞAMBA


Anahtarlık için NSCoding uyumlu herhangi bir nesnenin tasarruf sağlayan basit bir sarıcı yazdım. Örneğin, bir NSDictionary e-posta ve parolanızı saklamak ve Anahtarlık bu sınıfı kullanarak NSDictionary mağaza.

SimpleKeychain.h

#import <Foundation/Foundation.h>

@class SimpleKeychainUserPass;

@interface SimpleKeychain : NSObject

  (void)save:(NSString *)service data:(id)data;
  (id)load:(NSString *)service;
  (void)delete:(NSString *)service;

@end

SimpleKeychain.m

#import "SimpleKeychain.h"

@implementation SimpleKeychain

  (NSMutableDictionary *)getKeychainQuery:(NSString *)service {
    return [NSMutableDictionary dictionaryWithObjectsAndKeys:
            (id)kSecClassGenericPassword, (id)kSecClass,
            service, (id)kSecAttrService,
            service, (id)kSecAttrAccount,
            (id)kSecAttrAccessibleAfterFirstUnlock, (id)kSecAttrAccessible,
            nil];
}

  (void)save:(NSString *)service data:(id)data {
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    SecItemDelete((CFDictionaryRef)keychainQuery);
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];
    SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}

  (id)load:(NSString *)service {
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
    [keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)keyData];
        }
        @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", service, e);
        }
        @finally {}
    }
    if (keyData) CFRelease(keyData);
    return ret;
}

  (void)delete:(NSString *)service {
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    SecItemDelete((CFDictionaryRef)keychainQuery);
}

@end

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • After Effects Tutorials w/ Mikey

    After Effect

    24 HAZİRAN 2009
  • Doc Adams

    Doc Adams

    20 HAZİRAN 2007
  • LounaTutorials

    LounaTutoria

    10 EYLÜL 2009