Я пытаюсь воспроизвести 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;
Что я делаю не так?Спасибо!