Вандад Нахавандипур - iOS. Приемы программирования
- Название:iOS. Приемы программирования
- Автор:
- Жанр:
- Издательство:Питер
- Год:2014
- Город:Санкт-Петербург
- ISBN:978-5-496-01016-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Вандад Нахавандипур - iOS. Приемы программирования краткое содержание
Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.
Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.
iOS. Приемы программирования - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
NSData *newData = [@"Mark Tremonti"
dataUsingEncoding: NSUTF8StringEncoding];
NSDictionary *update = @{
(__bridge id)kSecValueData: newData,
};
OSStatus updated = SecItemUpdate((__bridge CFDictionaryRef)query,
(__bridge CFDictionaryRef)update);
if (updated == errSecSuccess){
NSLog(@"Successfully updated the existing value");
} else {
NSLog(@"Failed to update the value. Error = %ld", (long)updated);
}
Обновляющий словарь, который мы передаем функции SecItemUpdate в качестве второго параметра, может содержать больше ключей чем один ключ kSecValueData, использованный в нашем примере. На самом деле этот словарь может содержать обновления для любого имеющегося элемента. Например, если вы хотите добавить комментарий к имеющемуся значению (комментарий — это строка), то можете выполнить обновление следующим образом:
#import «AppDelegate.h»
#import
@implementation AppDelegate
— (void) readExistingValue{
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 cfAttributes = NULL;
OSStatus found = SecItemCopyMatching((__bridge CFDictionaryRef)query,
(CFTypeRef *)&cfAttributes);
if (found == errSecSuccess){
NSDictionary *attributes =
(__bridge_transfer NSDictionary *)cfAttributes;
NSString *comments = attributes[(__bridge id)kSecAttrComment];
NSLog(@"Comments = %@", comments);
} else {
NSLog(@"Error happened with code: %ld", (long)found);
}
}
— (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,
};
OSStatus found = SecItemCopyMatching((__bridge CFDictionaryRef)query,
NULL);
if (found == errSecSuccess){
NSData *newData = [@"Mark Tremonti"
dataUsingEncoding: NSUTF8StringEncoding];
NSDictionary *update = @{
(__bridge id)kSecValueData: newData,
(__bridge id)kSecAttrComment: @"My Comments",
};
OSStatus updated = SecItemUpdate((__bridge CFDictionaryRef)query,
(__bridge CFDictionaryRef)update);
if (updated == errSecSuccess){
[self readExistingValue];
} else {
NSLog(@"Failed to update the value. Error = %ld", (long)updated);
}
} else {
NSLog(@"Error happened with code: %ld", (long)found);
}
self.window = [[UIWindow alloc]
initWithFrame: [[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
В этом примере важнее всего отметить, что мы включили в обновляющий словарь ключ kSecAttrComment. Как только обновление будет выполнено, мы считаем комментарий с помощью того самого метода считывания, который изучили в разделе 8.3.
См. также
Разделы 8.2 и 8.3.
8.5. Удаление значений из связки ключей
Постановка задачи
Требуется удалить элемент из связки ключей.
Решение
Воспользуйтесь функцией SecItemDelete.
Обсуждение
В разделе 8.2 мы научились сохранять значения в связке ключей. Для удаления этих значений потребуется использовать функцию SecItemDelete. Эта функция принимает всего один параметр: словарь типа CFDictionaryRef. Можно взять обычный словарь и преобразовать его в экземпляр CFDictionaryRef с помощью мостика, как мы поступали в других разделах этой главы. Словарь, передаваемый этому методу, должен содержать следующие ключи:
• kSecClass — тип элемента, который вы собираетесь удалить, например kSecClassGenericPassword;
• kSecAttrService — сервис, к которому привязан элемент. Сохраняя элемент, вы подбираете для него сервис, и этот же сервис вы должны указать здесь. Так, в предыдущих примерах мы задавали в качестве значения этого ключа идентификатор пакета нашего приложения. Если вы поступали так же, то просто задайте идентификатор пакета приложения в качестве значения этого ключа;
• kSecAttrAccount — здесь указывается ключ, который должен быть удален.
Если вы выполнили все указания, приведенные в разделе 8.2, то на данном этапе связка ключей имеет обобщенный пароль (kSecClassGenericPassword) с именем сервиса (kSecAttrService), равным идентификатору пакета приложения, а также имеет ключ (kSecAttrAccount), равный Full Name. Вот что нужно сделать, чтобы удалить этот ключ:
#import «AppDelegate.h»
#import
@implementation AppDelegate
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSString *key = @"Full Name";
NSString *service = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: service,
(__bridge id)kSecAttrAccount: key
};
OSStatus foundExisting =
SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL);
if (foundExisting == errSecSuccess){
OSStatus deleted = SecItemDelete((__bridge CFDictionaryRef)query);
if (deleted == errSecSuccess){
NSLog(@"Successfully deleted the item");
} else {
NSLog(@"Failed to delete the item.");
}
} else {
NSLog(@"Did not find the existing value.");
}
self.window = [[UIWindow alloc]
initWithFrame: [[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
После запуска этой программы (предполагается, что вы выполнили все инструкции из раздела 8.2) вы должны увидеть на консоли NSLog, соответствующий успешному удалению. В противном случае вы в любой момент можете считать значение функции SecItemDelete и узнать, почему возникла проблема.
См. также
Раздел 8.2.
8.6. Совместное использование данных из связки ключей в нескольких приложениях
Постановка задачи
Требуется, чтобы хранилищем данных связки ключей могли пользоваться два ваших приложения.
Решение
Сохраняя данные вашей связки ключей, укажите ключ kSecAttrAccessGroup в словаре, передаваемом функции SecItemAdd. Значением этого ключа должна быть группа доступа, которую вы найдете в разделе Entitlements (Разрешения) вашего профиля инициализации. Об этом мы говорили во введении к данной главе.
Обсуждение
Несколько приложений с одного и того же портала разработки могут совместно использовать область связки ключей. Чтобы не усложнять этот пример, в данном разделе рассмотрим взаимодействие всего двух приложений, но описанные методы применимы для любого количества программ.
Чтобы два приложения могли совместно использовать область связки ключей, должны выполняться следующие требования.
1. Оба приложения должны быть подписаны с помощью профиля инициализации, взятого с одного и того же портала для разработки под iOS.
2. Оба приложения должны иметь в своем профиле инициализации один и тот же групповой идентификатор (Group ID). Обычно это идентификатор команды (Team ID), выбираемый Apple. Рекомендую не менять этот групповой идентификатор при создании собственных профилей инициализации.
Читать дальшеИнтервал:
Закладка: