Kitty Опубликовано 15 октября, 2016 Поделиться Опубликовано 15 октября, 2016 Какие настройки в проекте IOS надо сделать чтобы при переводе приложения на задний фон, работоспособность компонента TBeacon сохранялась. Т.е. чтобы гарантировано происходили события компонента TBeacon - вход/выход из зоны (OnBeaconBeaconEnter и др.). В андроиде эти события происходят и тогда, когда приложение переведено в фон. Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 15 октября, 2016 Модераторы Поделиться Опубликовано 15 октября, 2016 может это поможет http://www.fmxexpress.com/allow-apps-to-run-in-background-under-firemonkey-in-delphi-10-berlin-on-ios/ Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 15 октября, 2016 Автор Поделиться Опубликовано 15 октября, 2016 Проект по ссылке не компилируется: [DCC Fatal Error] Project1.dpr(7): F2613 Unit 'DW.BackgroundTask.iOS.pas' not found. Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 15 октября, 2016 Модераторы Поделиться Опубликовано 15 октября, 2016 20 минут назад, Kitty сказал: Проект по ссылке не компилируется: [DCC Fatal Error] Project1.dpr(7): F2613 Unit 'DW.BackgroundTask.iOS.pas' not found. зайти в dpr и сделать так Цитата uses .... BackgroundTaskManager in 'BackgroundTaskManager.pas'; переименовать нужно модуль Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 18 октября, 2016 Автор Поделиться Опубликовано 18 октября, 2016 Попробовала этот код вставив в него работу TBeacon: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, FMX.Platform, BackgroundTaskManager, System.Beacon, System.Bluetooth, System.Beacon.Components; type TForm1 = class(TForm) Memo1: TMemo; Timer1: TTimer; Beacon1: TBeacon; procedure Timer1Timer(Sender: TObject); procedure Beacon1BeaconEnter(const Sender: TObject; const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList); procedure Beacon1BeaconExit(const Sender: TObject; const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList); private FManager: TBackgroundTaskManager; function ApplicationEventHandler(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; procedure SetApplicationEventHandler; procedure Start; procedure Stop; procedure TaskExpiryHandler(Sender: TObject); public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; var Form1: TForm1; implementation {$R *.fmx} uses FMX.Helpers.iOS; { TForm1 } procedure TForm1.Beacon1BeaconEnter(const Sender: TObject; const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList); begin Memo1.Lines.Add('Вход'); end; procedure TForm1.Beacon1BeaconExit(const Sender: TObject; const ABeacon: IBeacon; const CurrentBeaconList: TBeaconList); begin Memo1.Lines.Add('Выход'); end; constructor TForm1.Create(AOwner: TComponent); begin inherited; SetApplicationEventHandler; FManager := TBackgroundTaskManager.Create; FManager.OnExpiry := TaskExpiryHandler; Beacon1.Enabled := True; end; destructor TForm1.Destroy; begin FManager.Free; inherited; end; procedure TForm1.SetApplicationEventHandler; var LService: IFMXApplicationEventService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, LService) then LService.SetApplicationEventHandler(ApplicationEventHandler); end; procedure TForm1.Start; begin FManager.Start; Memo1.Lines.Add(Format('Time left: %.2f', [SharedApplication.backgroundTimeRemaining])); Beacon1.Enabled := True; Timer1.Tag := 0; Timer1.Enabled := True; end; procedure TForm1.Stop; begin Timer1.Enabled := False; FManager.Stop; end; procedure TForm1.TaskExpiryHandler(Sender: TObject); begin Memo1.Lines.Add('Oops! Expired'); end; procedure TForm1.Timer1Timer(Sender: TObject); begin Timer1.TagFloat := Timer1.TagFloat + Timer1.Interval / 1000; Memo1.Lines.Add(Format('Hopefully still running - %.0f', [Timer1.TagFloat])); if Timer1.TagFloat > 200 then begin Memo1.Lines.Add('Been running long enough..'); Stop; end; end; function TForm1.ApplicationEventHandler(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; begin case AAppEvent of TApplicationEvent.EnteredBackground: begin Memo1.Lines.Add('Entered Background'); Start; Result := True; end; TApplicationEvent.WillBecomeForeground: begin Stop; Memo1.Lines.Add('Becoming foreground, so I told iOS that I am not running a background task any more'); Result := True; end; else Result := False; end; end; end. Тестирование показало, что при переводе приложения в фон, сразу происходит выход из зоны т.е. TBeacon перестает работать в фоне. А тут в документации говориться, что TBeacon работает в фоне: https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf Q: If my app starts monitoring beacon regions, how will that affect battery performance? A : iOS devices that support iBeacon can efficiently monitor iBeacon regions in the background with marginal power drain. Monitoring iBeacon regions is significantly less power demanding than running normal location updates constantly in the background. Не понятно почему не работает... Цитата Ссылка на комментарий
0 Модераторы Равиль Зарипов (ZuBy) Опубликовано 18 октября, 2016 Модераторы Поделиться Опубликовано 18 октября, 2016 попробуйте выставить UIBackgroundModes -> bluetooth-central, так IOS будет знать что приложение обменивается данными по блютуз но это нужно проверять, я такое не пробовал Kitty 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 25 октября, 2016 Автор Поделиться Опубликовано 25 октября, 2016 (изменено) Большое спасибо! Попробовала. При переводе приложения в бекграунд (UIBackgroundModes -> bluetooth-centra), На основании кода выше, я вижу, что компонент TBeacon перестает работать и я вижу слово "Выход" Т.е. все эти рекомендации не работают: https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html#//apple_ref/doc/uid/TP40013257-CH7-SW1 Есть ли возможность гуру подсказать мне, что надо сделать, чтобы TBeacon работал в фоне. Изменено 26 октября, 2016 пользователем Kitty Равиль Зарипов (ZuBy) 1 Цитата Ссылка на комментарий
0 Kitty Опубликовано 25 октября, 2016 Автор Поделиться Опубликовано 25 октября, 2016 (изменено) delete Изменено 26 октября, 2016 пользователем Kitty Цитата Ссылка на комментарий
Вопрос
Kitty
Какие настройки в проекте IOS надо сделать чтобы при переводе приложения на задний фон, работоспособность компонента TBeacon сохранялась.
Т.е. чтобы гарантировано происходили события компонента TBeacon - вход/выход из зоны (OnBeaconBeaconEnter и др.).
В андроиде эти события происходят и тогда, когда приложение переведено в фон.
Ссылка на комментарий
7 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.