Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

};

Если функция SecItemAdd завершится успешно, то в качестве ее возвращаемого значения вы получите errSecSuccess. Иное значение, получаемое от этой функции, означает ошибку. Итак, давайте объединим изученное и сделаем небольшой код, который будет записывать строковое значение в связку ключей:

#import «AppDelegate.h»

#import <Security/Security.h>

@implementation AppDelegate

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSString *key = @"Full Name";

NSString *value = @"Steve Jobs";

NSData *valueData = [value dataUsingEncoding: NSUTF8StringEncoding];

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

NSDictionary *secItem = @{

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

(__bridge id)kSecAttrService: service,

(__bridge id)kSecAttrAccount: key,

(__bridge id)kSecValueData: valueData,

};

CFTypeRef result = NULL;

OSStatus status = SecItemAdd((__bridge CFDictionaryRef)secItem, &result);

if (status == errSecSuccess){

NSLog(@"Successfully stored the value");

} else {

NSLog(@"Failed to store the value with code: %ld", (long)status);

}

self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

При

первом запуске этого приложения (предполагается, что вы выполнили все рекомендации из предыдущих разделов этой главы и правильно настроили свой профиль) вы получите от функции SecItemAdd значение errSecSuccess. Однако если вы повторно запустите это приложение, то получите значение errSecDuplicateItem. Таким образом iOS сообщает вам, что нельзя перезаписать имеющееся значение. В контексте строгих требований безопасности, применяемых в связке ключей, перезаписать имеющееся значение действительно нельзя. Но вот обновить имеющееся значение вы можете. О том, как это делается, рассказано далее в данной главе.

См. также

Раздел 8.1.

8.3. Нахождение значений в связке ключей

Постановка задачи

Требуется найти в связке ключей имеющийся там элемент.

Решение

Воспользуйтесь функцией SecItemCopyMatching. Выполните следующие шаги.

1. Создайте словарь для передачи вышеупомянутой функции.

Добавьте к словарю ключ kSecClass. Присвойте ключу такое значение, чтобы он отражал тип искомого элемента. Как правило, здесь требуется значение kSecClassGenericPassword.

2. Добавьте в словарь ключ kSecAttrService. В качестве значения этого ключа установите сервисную строку того элемента, который вы ищете. В этой главе в качестве имен сервисов мы используем идентификатор пакета нашего приложения и устанавливаем в качестве идентификаторов пакета всех приложений одну и ту же строку. Таким образом, одно приложение может считывать связку ключей, другое — записывать в нее данные и т. д.

3. Добавьте в словарь ключ kSecAttrAccount и задайте в качестве его значения текущий ключ того значения, которое вы ранее сохранили в связке ключей. Если вы внимательно проработали пример из раздела 8.2, то в данном случае именем учетной записи будет служить строка Full Name.

4. Добавьте к словарю атрибут kSecReturnAttributes. В качестве его значения задайте kCFBooleanTrue, если хотите получить атрибуты значения, присутствующего в связке ключей (например, дату создания и дату последнего изменения). Если хотите получить текущее значение элемента, сохраненного вами в связке ключей, а не ключ kSecReturnAttributes, добавьте к словарю ключ kSecReturnData и задайте для него значение kCFBooleanTrue.

Как только ваш словарь будет готов, вы сможете передать его функции SecItemCopyMatching в качестве первого параметра. Второй параметр — это указатель на тот объект, который будет возвращаться функцией. Этот указатель должен относиться к типу CFTypeRef *. Это обобщенный тип данных, и в каждом конкретном случае тип зависит от того, что именно вы передадите функции SecItemCopyMatching в качестве первого параметра. Например, если в вашем словаре содержится ключ kSecReturnAttributes, то вторым параметром этой функции должен быть либо NULL, либо указатель на непрозрачный тип CFDictionaryRef. Если же вместо этого вы передадите словарю ключ kSecReturnData, то второй параметр этой функции должен относиться к типу CFDataRef. Это непрозрачный тип, который будет получать точные данные имеющегося элемента. Затем вы сможете преобразовать эти данные в экземпляр NSString и работать с ним.

Обсуждение

Предположим, вы хотите считать свойства той строки, которую записали в связку ключей в разделе 8.2. Можно написать такой код:

— (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)kSecReturnAttributes: (__bridge id)kCFBooleanTrue,

};

CFDictionaryRef valueAttributes = NULL;

OSStatus results = SecItemCopyMatching((__bridge CFDictionaryRef)query,

Поделиться:
Популярные книги

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Бастард

Майерс Александр
1. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард

Deus vult

Зот Бакалавр
9. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Deus vult

Моя простая курортная жизнь 3

Блум М.
3. Моя простая курортная жизнь
Юмор:
юмористическая проза
5.00
рейтинг книги
Моя простая курортная жизнь 3

Горизонт Вечности

Вайс Александр
11. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Горизонт Вечности

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Я царь. Книга XXVIII

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Сфирот

Прокофьев Роман Юрьевич
8. Стеллар
Фантастика:
боевая фантастика
рпг
6.92
рейтинг книги
Сфирот

Точка Бифуркации III

Смит Дейлор
3. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации III

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

Убивать чтобы жить 6

Бор Жорж
6. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 6

Спасите меня, Кацураги-сан! Том 12

Аржанов Алексей
12. Токийский лекарь
Фантастика:
попаданцы
дорама
фэнтези
5.00
рейтинг книги
Спасите меня, Кацураги-сан! Том 12

Имя нам Легион. Том 11

Дорничев Дмитрий
11. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 11

Графиня с изъяном. Тайна живой стали

Лин Айлин
Фантастика:
фэнтези
героическая фантастика
киберпанк
5.00
рейтинг книги
Графиня с изъяном. Тайна живой стали