Delphi / FMX + iOS: UNUserNotificationCenter не вызывает события делегата (локальные уведомления) - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь воспроизвести UNUserNotificationCenter (iOS10 +) с Delphi / Firemonkey.Приложение успешно авторизуется для получения уведомлений и показывает все локальные уведомления, как и ожидалось, когда UNUserNotificationCenter не вызывает события делегата (например, когда пользователь нажимает на элемент уведомления).

type
  UNUserNotificationCenterDelegate = interface(IObjectiveC)
    ['{817A2C54-2F1E-4322-8BDB-2E77F8FAB1AE}']
    procedure willPresentNotification(center: UNUserNotificationCenter; notification: UNNotification; completionHandler: TUserNotificationsWithCompletionHandler1); cdecl;
    procedure didReceiveNotificationResponse(center: UNUserNotificationCenter; response: UNNotificationResponse; completionHandler: TUserNotificationsWithCompletionHandler2); cdecl;
  end;

Мой объект делегата:

type
  TUserNotificationCenterDelegate = class(TOCLocal, UNUserNotificationCenterDelegate)
  public
    procedure willPresentNotification(center: UNUserNotificationCenter; notification: UNNotification; completionHandler: TUserNotificationsWithCompletionHandler1); cdecl;
    procedure didReceiveNotificationResponse(center: UNUserNotificationCenter; response: UNNotificationResponse; completionHandler: TUserNotificationsWithCompletionHandler2); cdecl;
  end;

var
  NotificationCenterDelegate: TUserNotificationCenterDelegate; 

implementation

[...]

function TfrmApplication.AppEventHandler(AAppEvent: TApplicationEvent; AContext: TObject): Boolean;
begin
  Result := true;

  case AAppEvent of
    TApplicationEvent.FinishedLaunching:
    begin
       UserNotificationCenterDelegate := TUserNotificationCenterDelegate.Create;
       TUNUserNotificationCenter.OCClass.currentNotificationCenter.setDelegate((UserNotificationCenterDelegate as ILocalObject).GetObjectID);   
       TUNUserNotificationCenter.OCClass.currentNotificationCenter.requestAuthorizationWithOptions(UNAuthorizationOptionAlert + UNAuthorizationOptionSound, nil);
    end;
    TApplicationEvent.EnteredBackground:
    begin
      DEF_APPLICATION_IN_BACKGROUND := true;
    end;
    TApplicationEvent.BecameActive:
    begin
      DEF_APPLICATION_IN_BACKGROUND := false;
      TUNUserNotificationCenter.OCClass.currentNotificationCenter.removeAllDeliveredNotifications;
    end;
  else
    Result := false;
  end;
end;

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

procedure TUserNotificationCenterDelegate.willPresentNotification(center: UNUserNotificationCenter; notification: UNNotification; completionHandler: TUserNotificationsWithCompletionHandler1); cdecl;
var
  aImp: procedure(options: NSUInteger); cdecl;
  aOptions: UNNotificationPresentationOptions;
begin
  WriteLog(AP_LOG_HEADER + 'Will present notification');
  //completionHandler
  @aImp := imp_implementationWithBlock(completionHandler);
  aOptions := UNNotificationPresentationOptionAlert;
  aImp(aOptions);
  imp_removeBlock(@aImp);
end;

procedure TUserNotificationCenterDelegate.didReceiveNotificationResponse(center: UNUserNotificationCenter; response: UNNotificationResponse; completionHandler: TUserNotificationsWithCompletionHandler2); cdecl;
var
  aImp: procedure(); cdecl;
begin
  WriteLog(AP_LOG_HEADER + 'Receive notification response');
  //completionHandler
  @aImp := imp_implementationWithBlock(completionHandler);
  aImp();
  imp_removeBlock(@aImp);
end;

Что я делаю не так?Спасибо!

...