Читаем iOS. Приемы программирования полностью

CFDictionaryRef valueAttributes = NULL;

OSStatus results = SecItemCopyMatching((__bridge CFDictionaryRef)query,

(CFTypeRef *)&valueAttributes);


NSDictionary *attributes =

(__bridge_transfer NSDictionary *)valueAttributes;


if (results == errSecSuccess){


NSString *key, *accessGroup, *creationDate, *modifiedDate, *service;


key = attributes[(__bridge id)kSecAttrAccount];

accessGroup = attributes[(__bridge id)kSecAttrAccessGroup];

creationDate = attributes[(__bridge id)kSecAttrCreationDate];

modifiedDate = attributes[(__bridge id)kSecAttrModificationDate];

service = attributes[(__bridge id)kSecAttrService];


NSLog(@"Key = %@\n \

Access Group = %@\n \

Creation Date = %@\n \

Modification Date = %@\n \

Service = %@", key, accessGroup, creationDate,

modifiedDate, service);


} else {

NSLog(@"Error happened with code: %ld", (long)results);

}


self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}


После запуска этого приложения на консоль будут выведены примерно такие результаты:


Key = Full Name

Access Group = F3FU372W5M.com.pixolity.ios.cookbook.SecurityApp

Creation Date = 2013-06-09 10:44:55 +0000

Modification Date = 2013-06-09 10:44:55 +0000

Service = com.pixolity.ios.cookbook.SecurityApp


Это, конечно, хорошо, но как считывать актуальную информацию о значении? В подразделе «Решение» данного раздела я уже ответил на этот вопрос: необходимо включить в запрос ключ kSecReturnData. После того как это будет сделано, в качестве второго параметра функция SecItemCopyMatching потребует либо NULL, либо непрозрачную переменную CFDataRef, вот так:


#import «AppDelegate.h»

#import 


@implementation AppDelegate


— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{


NSString *keyToSearchFor = @"Full Name";

NSString *service = [[NSBundle mainBundle] bundleIdentifier];


NSDictionary *query = @{

(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,

(__bridge id)kSecAttrService: service,

(__bridge id)kSecAttrAccount: keyToSearchFor,

(__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue,

};


CFDataRef cfValue = NULL;

OSStatus results = SecItemCopyMatching((__bridge CFDictionaryRef)query,

(CFTypeRef *)&cfValue);


if (results == errSecSuccess){


NSString *value = [[NSString alloc]

initWithData:(__bridge_transfer NSData *)cfValue

encoding: NSUTF8StringEncoding];


NSLog(@"Value = %@", value);


} else {

NSLog(@"Error happened with code: %ld", (long)results);

}


self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}


Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже