Группа доступа является общим идентификатором моей команды и соответствует группе, имеющей доступ к нашей общей связке ключей. Разумеется, в вашем случае это значение будет другим. Воспользуйтесь приемами, изученными в разделе 8.0 этой главы, чтобы извлечь разрешения из ваших профилей инициализации.

Для первого из наших iOS-приложений я задам следующие настройки. Вы должны заменить их собственными.

• Идентификатор пакета com.pixolity.ios.cookbook.SecurityApp.

 Группа доступа к связке ключей F3FU372W5M.*.

 Профиль инициализации, специально созданный для идентификатора пакета данного приложения.

А вот мои настройки для второго приложения — того, которое будет считывать из связки ключей значения, сохраненные там первым приложением.

• Идентификатор пакета com.pixolity.ios.cookbook.SecurityApp.

 Группа доступа к связке ключей F3FU372W5M.*.

 Профиль инициализации, специально созданный для идентификатора пакета данного приложения, но отличающийся от аналогичного профиля, созданного для первого приложения.

Самая важная деталь, отличающая первое приложение (сохраняющее связку ключей) от второго (считывающего цепочку ключей), — это идентификаторы пакетов. Первое приложение будет использовать свой идентификатор пакета для сохранения значения в связке ключей, а второе — использовать идентификатор пакета первого приложения для считывания того самого значения из связки ключей. Код очень напоминает тот, что мы написали в разделе 8.2. Разница заключается в том, что новый код будет указывать группу доступа к связке ключей при сохранении данных в этой связке ключей:

#import «AppDelegate.h»

#import 

@implementation AppDelegate

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSString *key = @"Full Name";

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

NSString *accessGroup = @"F3FU372W5M.*";

/* Сначала удаляем имеющееся значение, если оно существует. Этого можно

и не делать, но SecItemAdd завершится с ошибкой, если имеющееся

значение окажется в связке ключей */

NSDictionary *queryDictionary = @{

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

(__bridge id)kSecAttrService: service,

(__bridge id)kSecAttrAccessGroup: accessGroup,

(__bridge id)kSecAttrAccount: key,

};

SecItemDelete((__bridge CFDictionaryRef)queryDictionary);

/* Затем запишем новое значение в связку ключей */

NSString *value = @"Steve Jobs";

NSData *valueData = [value dataUsingEncoding: NSUTF8StringEncoding];

NSDictionary *secItem = @{

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

(__bridge id)kSecAttrService: service,

(__bridge id)kSecAttrAccessGroup: accessGroup,

(__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]];

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Похожие книги