Вход/Регистрация
iOS. Приемы программирования
вернуться

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

Шрифт:

NSLog(@"Finished playing the song");

/* Параметр flag сообщает, удалось ли успешно закончить воспроизведение */

if ([player isEqual: self.audioPlayer]){

self.audioPlayer = nil;

} else {

/* Это не наш аудиоплеер! */

}

}

Кроме того, необходимо учитывать, что, когда приложение воспроизводит аудиофайл в фоновом режиме, не будет изменяться значение, возвращаемое свойством backgroundTimeRemaining класса UIApplication. Иными словами этот аспект можно описать так: приложение, запрашивающее возможность воспроизведения аудио в фоновом режиме, не запрашивает у операционной системы iOS, явно или неявно, дополнительное время на исполнение кода.

14.5. Обработка геолокационных изменений в фоновом режиме

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

Вы пишете приложение, основной функционал которого заключается в обработке геолокационных изменений с помощью фреймворка Core Location. Необходимо, чтобы создаваемое приложение получало данные об изменении местоположения устройства с iOS, даже если приложение переходит в фоновый режим.

Решение

Выберите приложение в навигаторе (Navigator) в Xcode. Затем в разделе Capabilities (Возможности) перейдите в подраздел Background Modes (Фоновые режимы). После того как система выведет список фоновых режимов, нажмите переключатель Location (Местоположение).

Обсуждение

Когда приложение работает в приоритетном режиме, можно получать от экземпляра CLLocationManager делегатные сообщения, информирующие вас о том, что iOS обнаружила перемещение устройства на новое место. Однако если приложение переходит в фоновый режим и становится неактивным, то делегатные сообщения не будут доставляться к нему в обычном порядке. В таком случае все делегатные сообщения поступят в программу одним пакетом, как только она снова перейдет в приоритетный режим.

Если для работы приложения вам необходима возможность получать информацию об изменении местоположения пользовательского устройства, даже если программа работает в фоновом режиме, то нужно добавить значение location к ключу UIBackgroundModes в основной файл. plist вашего приложения, как показано в подразделе «Решение» данного раздела. В таком случае, даже будучи в фоновом режиме, ваше приложение продолжит получать информацию об изменении местоположения устройства. Протестируем простое приложение, в котором у нас будет только делегат.

В этом приложении я собираюсь сохранить логическое значение в делегате приложения, которое будет называться executingInBackground. Когда приложение переходит в фоновый режим, задам этому делегату значение YES, а когда оно вернется в приоритетный режим — изменю данное значение на NO. Когда будут получены данные об изменении геолокационной информации от Core Location, мы проверим этот флаг. Если флаг установлен в YES, то мы не будем заниматься никакими энергоемкими вычислениями или любыми обновлениями пользовательского интерфейса, поскольку наше приложение сейчас работает в фоновом режиме. Мы, будучи ответственными программистами, не будем нагружать приложение никакими тяжелыми задачами. Но если программа действует в приоритетном режиме, то в нашем распоряжении вся вычислительная мощность устройства, которую мы можем бросить на обработку необходимых функций. Кроме того, попытаемся добиться максимальной точности при определении местоположения, если наша программа работает в приоритетном режиме. Когда же программа уходит в фоновый режим, эту точность можно смело снизить, чтобы уменьшить нагрузку на геолокационные сенсоры. Итак, определим делегат приложения:

#import <UIKit/UIKit.h>

#import <CoreLocation/CoreLocation.h>

@interface AppDelegate <CLLocationManagerDelegate>

@property (nonatomic, strong) UIWindow *window;

@property (nonatomic, strong) CLLocationManager *myLocationManager;

@property (nonatomic, unsafe_unretained, getter=isExecutingInBackground)

BOOL executingInBackground;

@end

@implementation AppDelegate

<# Остаток вашего кода находится здесь #>

Продолжим. Создадим диспетчер местоположения и запустим его сразу после запуска приложения:

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

self.myLocationManager = [[CLLocationManager alloc] init];

self.myLocationManager.desiredAccuracy = kCLLocationAccuracyBest;

self.myLocationManager.delegate = self;

[self.myLocationManager startUpdatingLocation];

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

  • Читать дальше
  • 1
  • ...
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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