• 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

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


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

2 ответа на этот вопрос

  • 0

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

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


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

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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

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

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