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

на главную

Жанры

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

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

Шрифт:

Обсуждение

Когда приложение работает в приоритетном режиме, можно получать от экземпляра 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;

}

Как

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

— (void)applicationDidEnterBackground:(UIApplication *)application{

self.executingInBackground = YES;

/* Снижаем точность определения местоположения и нагрузку

на iOS, пока работаем в фоновом режиме. */

self.myLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;

}

Когда программа вернется из фонового режима в приоритетный, точность опять можно будет поднять до высокого уровня:

— (void)applicationWillEnterForeground:(UIApplication *)application{

self.executingInBackground = NO;

/* Теперь, когда приложение вернулось в приоритетный режим, повышаем

точность определения местоположения. */

self.myLocationManager.desiredAccuracy = kCLLocationAccuracyBest;

}

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

— (void)locationManager:(CLLocationManager *)manager

didUpdateToLocation:(CLLocation *)newLocation

fromLocation:(CLLocation *)oldLocation{

if ([self isExecutingInBackground]){

/* Работаем в фоновом режиме.

Не выполняем никакой сложной обработки. */

} else {

/* Работаем в приоритетном режиме. Запускаем любые вычисления,

какие требуются */

}

}

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

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Скрываясь в тени

Мазуров Дмитрий
2. Теневой путь
Фантастика:
боевая фантастика
7.84
рейтинг книги
Скрываясь в тени

На границе тучи ходят хмуро...

Кулаков Алексей Иванович
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...

Восход. Солнцев. Книга I

Скабер Артемий
1. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга I

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2

Системный Нуб 4

Тактарин Ринат
4. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб 4

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Мастер 2

Чащин Валерий
2. Мастер
Фантастика:
фэнтези
городское фэнтези
попаданцы
технофэнтези
4.50
рейтинг книги
Мастер 2

Титан империи 5

Артемов Александр Александрович
5. Титан Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Титан империи 5

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Последний рейд

Сай Ярослав
5. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Последний рейд

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Неудержимый. Книга XIV

Боярский Андрей
14. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XIV

Младший сын князя

Ткачев Андрей Сергеевич
1. Аналитик
Фантастика:
фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Младший сын князя