Расскажу о том как я добился нормальной фоновой работы приложения. В моем понимании нормальная фоновая работа приложения - это сохранять геокоординаты и систематически (по мере их накопления передавать на сервер). По сути у нас получился трекер. Те кто считают что iOS такое не умеет делать, и все что будет написано ниже это фейк лучше закройти эту тему. Итак начнем, по пунктам:
1) Добавляем к проекту ключ NSLocationAlwaysAndWhenInUseUsageDescription - для новых иОС это обязательно, начиная с 11 или 12 версии уже не помню
2) Сообщаем приложению о намерении что мы будем использовать геокоординаты в фоне (редактируем ключ UIBackgroundModes выставляя галочку напротив location)
3) Далее для того чтобы не поломать другие приложения которые используют геолокацию создаем специальную дерективу, которая будет сообщать о том что наше приложение будет использовать геолокацию в фоне, я ее назвал iOS_RequestAlwaysAuthorization
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
Собственно вот результат данного трекера:
Если приблизить то можно увидеть насколько точно и часто он обновляет координаты:
И да, огромное спасибо человеку с ником Artyom Karapetyan, именно он натолкнул на мысль того как надо правильно все сделать