Перейти к содержанию
  • 2
FeLDMARShaL

[iOS] Полноценная фоновая работа приложения

Вопросы

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

1) Добавляем к проекту ключ NSLocationAlwaysAndWhenInUseUsageDescription - для новых иОС это обязательно, начиная с 11 или 12 версии уже не помню

image.thumb.png.ce59552eb04af61dd0f6b4b81d17cf13.png

2) Сообщаем приложению о намерении что мы будем использовать геокоординаты в фоне (редактируем ключ UIBackgroundModes выставляя галочку напротив location)

image.thumb.png.35332c025c2e8f1c3a891a2b44a67c9e.png

3) Далее  для того чтобы не поломать другие приложения которые используют геолокацию создаем специальную дерективу, которая будет сообщать о том что наше приложение будет использовать геолокацию в фоне, я ее назвал iOS_RequestAlwaysAuthorization

image.thumb.png.9e93b2b7f7cb4116a704401255f9368c.png

4) Дальше намного сложнее, нам нужно исправить исходники самой Delphi, а именно System.iOS.Sensors. Изменять будем процедуру TiOSLocationSensor.DoStart, все что отличается от стандартного у меня в рамках описания моей директивы:

function TiOSLocationSensor.DoStart: Boolean;
var
  I: Integer;
begin
  {$ifdef iOS_RequestAlwaysAuthorization}
  if TOSVersion.Check(8) and (FLocater <> nil) then
    FLocater.requestAlwaysAuthorization;
  {$else iOS_RequestAlwaysAuthorization}
  if TOSVersion.Check(8) and (FLocater <> nil) then
    FLocater.requestWhenInUseAuthorization;
  {$endif iOS_RequestAlwaysAuthorization}

  // check authorization
  if Authorized = TAuthorizationType.atUnauthorized then
    SensorError(SLocationServiceUnauthorized);
  // check if location sensor is enabled
  if not FLocater.locationServicesEnabled then
    SensorError(SLocationServiceDisabled);

  // start location updates
  if (LocationChange = TLocationChangeType.lctLarge) and CanUseSignifChangeNotifs then
    FLocater.startMonitoringSignificantLocationChanges
  else
    FLocater.startUpdatingLocation;

  // start heading updates
  if CanUseHeading then
  begin
    FLocater.startUpdatingHeading;
  end;

  // start monitoring regions
  if CanMonitorRegions then
    for I := 0 to Regions.Count - 1 do
      FLocater.startMonitoringForRegion(ConvLocationRegion(Regions[I]));
  Result := FLocater.locationServicesEnabled;
  if Result then
    Result := Authorized = TAuthorizationType.atAuthorized;

  {$ifdef iOS_RequestAlwaysAuthorization}
  FLocater.setAllowsBackgroundLocationUpdates(True);
  FLocater.setPausesLocationUpdatesAutomatically(False);
  {$endif iOS_RequestAlwaysAuthorization}

end;

Собственно усе, можно наслаждаться фоновой работой. Все это работает под Delphi 10.2.3. На телефоне iPhone 6s под управлением iOS 11. Как было сказано выше, работает как геолокация так и инет и вообще все остальные процессы внтури приложения, такие как TTimer :)

Собственно вот результат данного трекера:

image.png.a910ead1221d6478c7b0cc3ff85899da.png

 

Если приблизить то можно увидеть насколько точно и часто он обновляет координаты:

image.thumb.png.270127a3903a7302175ad151b47af48d.png

 

И да, огромное спасибо человеку с ником Artyom Karapetyan, именно он натолкнул на мысль того как надо правильно все сделать :)

Отредактировал FeLDMARShaL

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рекомендуемые сообщения

  • 0

Спасибо! А нужны ли какие то магические дополнительные действия если речь идет о C++Builder?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, Anatoliy сказал:

Спасибо! А нужны ли какие то магические дополнительные действия если речь идет о C++Builder?

В душе не знаю :), ниразу не пользовал и даже не устанавливал. Предполагаю проверить камунибуть и отписаться о результате. Вдруг что то забыл рассказать, но вроде все упомянул.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...