Перейти к содержанию
Fire Monkey от А до Я
  • 0

TBeacon в iOS


Kitty

Вопрос

Какие настройки в проекте IOS надо сделать чтобы при переводе приложения на задний фон, работоспособность компонента TBeacon сохранялась.

Т.е. чтобы гарантировано происходили события компонента TBeacon - вход/выход из зоны (OnBeaconBeaconEnter и др.).

В андроиде эти события происходят и тогда, когда приложение переведено в фон.

 

Ссылка на комментарий

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

  • 0
  • Модераторы
20 минут назад, Kitty сказал:

Проект по ссылке не компилируется:

[DCC Fatal Error] Project1.dpr(7): F2613 Unit 'DW.BackgroundTask.iOS.pas' not found.

зайти в dpr и сделать так

Цитата

uses
  ....
  BackgroundTaskManager in 'BackgroundTaskManager.pas';

переименовать нужно модуль

Ссылка на комментарий
  • 0

Попробовала этот код вставив в него работу 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
  • Модераторы

попробуйте выставить UIBackgroundModes -> bluetooth-central, так IOS будет знать что приложение обменивается данными по блютуз

но это нужно проверять, я такое не пробовал

Ссылка на комментарий
  • 0

Большое спасибо! Попробовала. При переводе приложения в бекграунд (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 работал в фоне.

Изменено пользователем Kitty
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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