Когда ваше приложение переходит в фоновый режим (например, при нажатии кнопки Home (Домой)), а затем возвращается на передний план (когда пользователь вновь выбирает это приложение), система начинает посылать различные сообщения. Ожидается, что эти сообщения будут получены объектом, который мы назначаем делегатом нашего приложения. Например, когда приложение переходит в фоновый режим, делегат приложения получит метод applicationDidEnterBackground:. Аналогично, когда пользователь вновь вернет приложение в приоритетный режим, то есть возобновит с ним работу, делегат приложения получит делегатное сообщение applicationWillEnterForeground:.
Кроме этих сообщений делегатов iOS также посылает работающему приложению уведомления, когда переводит эту программу в фоновый режим или возвращает обратно в приоритетный режим. При переходе приложения в фоновый режим посылается уведомление UIApplicationDidEnterBackgroundNotification, а при переходе из фонового режима в приоритетный — уведомление UIApplicationWillEnterForegroundNotification. Для регистрации этих уведомлений можно использовать центр уведомлений, задаваемый по умолчанию.
14.1. Обнаружение доступности многозадачности
Необходимо выяснить, поддерживается ли многозадачность на том устройстве с iOS, на котором работает ваше приложение.
Вызовите метод экземпляра isMultitaskingSupported, относящийся к классу UIDevice:
— (BOOL) isMultitaskingSupported{
BOOL result = NO;
if ([[UIDevice currentDevice]
respondsToSelector:@selector(isMultitaskingSupported)]){
result = [[UIDevice currentDevice] isMultitaskingSupported];
}
return result;
}
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
if ([self isMultitaskingSupported]){
NSLog(@"Multitasking is supported.");
} else {
NSLog(@"Multitasking is not supported.");
}
self.window = [[UIWindow alloc] initWithFrame:
[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
В зависимости от того, на работу в какой версии iOS рассчитано ваше приложение, его можно запускать и выполнять на различных устройствах, где установлены разные версии iOS. Например, вы можете разрабатывать приложение в последней версии iOS SDK, но в качестве целевой (наиболее ранняя версия iOS, в которой сможет работать ваше приложение) задать более низкую версию. В этом случае приложение сможет работать на устройстве с более ранней версией операционной системы, но, возможно, это устройство не будет поддерживать многозадачность. Золотое правило, действующее как в программировании, так и в жизни вообще (не подумайте, что я берусь философствовать), таково: если вы пытаетесь гадать, то рано или поздно ошибетесь. Поэтому не пытайтесь угадать, на каких устройствах в данное время работает ваше приложение. Ведь если iOS-разработчик указывает в Xcode минимальную поддерживаемую версию iOS, он тем самым автоматически ограничивает свою пользовательскую аудиторию. Наша цель — добиться, чтобы обладатели любых устройств с iOS, существующих в настоящее время, могли пользоваться нашим приложением. Поэтому если вы хотите задействовать в приложении для iOS новейшие возможности многозадачности, обязательно проверяйте, доступна ли многозадачность на данном устройстве. Если многозадачность недоступна, необходимо гарантировать, что приложение корректно отреагирует на это, например выберет альтернативный режим выполнения.
14.2. Выполнение долгосрочной задачи в фоновом режиме
Требуется «занять» немного времени у iOS и выполнить долгосрочную задачу, пока приложение находится в фоновом режиме.
Воспользуйтесь методом экземпляра beginBackgroundTaskWithExpirationHandler:, относящимся к классу UIApplication. После того как задача будет решена, вызовите метод экземпляра endBackgroundTask:, относящийся к классу UIApplication.
Когда приложение переходит в фоновый режим, работа его основного потока приостанавливается. Потоки, которые вы создаете в своем приложении с помощью метода класса detachNewThreadSelector: toTarget: withObject:, относящегося к классу NSThread, также приостанавливаются. Если вы пытаетесь решить долгосрочную задачу за то время, пока приложение находится в фоновом режиме, необходимо вызвать метод экземпляра beginBackgroundTaskWithExpirationHandler:, относящийся к классу UIApplication, чтобы «занять» немного времени у системы iOS. Свойство backgroundTimeRemaining класса UIApplication содержит количество секунд, которые требуются приложению для завершения той или иной задачи. Если приложение не успеет завершить долгосрочную задачу до того, как истечет отведенный временной промежуток, iOS завершит приложение. За каждым вызовом метода beginBackgroundTaskWithExpirationHandler: должен следовать соответствующий вызов метода endBackgroundTask: (другой метод экземпляра UIApplication). Иными словами, если вы просите у iOS дополнительное время на завершение задачи, то должны и сообщить iOS, когда закончите эту задачу. Когда это будет сделано и окажется, что больше нет задач, которые следовало бы выполнить в фоновом режиме, ваше приложение перейдет в фоновый режим целиком и все его потоки будут приостановлены.
Читать дальше
Конец ознакомительного отрывка
Купить книгу