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

Приложение на macOS не отправляет уведомления


Алиса Романец

Вопрос

Есть приложение, написанное ещё в RAD Studio 10.3 и мигрировавшее на 10.4. При миграции на 10.3.3 у приложения просто исчезла возможность отправлять уведомления. TNotificationCenter на macOS выдавал ошибку AccessViolation, в то время как на Windows всё работало отлично, уведомления приходили, никаких проблем.

Спустя какое-то время, приложение мигрировало на RAD Studio 10.4, где переписали компонент TNotificationCenter и исправили баг в Macapi.Foundation (что позволило адекватным способом отправлять уведомления напрямую через Cocoa). Но теперь вылезла другая проблема - формы с компонентом TNotificationCenter стали падать, даже не доходя до события OnCreate с ошибкой в консоли PAServer

2020-07-21 01:05:06.361 AErenderLauncher[11672:433325] *** Assertion failure in +[UNUserNotificationCenter currentNotificationCenter], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UserNotifications/UserNotifications-279/UNUserNotificationCenter.m:47

2020-07-21 01:05:06.362 AErenderLauncher[11672:433325] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'application bundle identifier for LSApplicationProxy with bundle identifier (null)'

То есть, как я поняла, проблема именно в компоненте TNotificationCenter, который стал фаталить всю прогу. Убрала этот компонент со всех форм, ограничила его {$IFDEF MSWINDOWS} в коде - прога стала прекрасно запускаться на macOS. Тут уже у меня возникли некоторые вопросы, потому что в новых приложениях такой ошибки не возникало (там возникала другая, что TNotificationCenter не может спросить разрешения у системы на отправку уведомлений). Решила я найти способ, как можно отправлять уведомления напрямую из Cocoa, и нашла следующий код на Swift

@IBAction func sendNotification(_ sender: Any) {
  let notification = NSUserNotification();
  notification.title = "Notification Title";
  notification.subtitle = "Foo Bar";
  notification.informativeText = "Very informative. Such notification!";
  notification.soundName = NSUserNotificationDefaultSoundName;
  
  let notificationCenter = NSUserNotificationCenter.default;
  notificationCenter.deliver(notification);
}

Перепишем на Object Pascal, получим

procedure TMainForm.Button1Click(Sender: TObject);
begin
  var ANotification: NSUserNotification := TNSUserNotification.Wrap(TNSUserNotification.Alloc.init);
  ANotification.setTitle(StrToNSStr('Notification Title'));
  ANotification.setSubtitle(StrToNSStr('Foo Bar'));
  ANotification.setInformativeText(StrToNSStr('Very informative. Such notification!'));
  ANotification.setSoundName(NSUserNotificationDefaultSoundName);

  var ANotificationCenter: NSUserNotificationCenter := TNSUserNotificationCenter.Wrap(TNSUserNotificationCenter.OCClass.defaultUserNotificationCenter);
  ANotificationCenter.deliverNotification(ANotification);
end;

И в результате имеем ту же самую проблему - во всех новых приложениях данный код работает, как надо (и разрешение на отправку уведомлений приходит, и уведомления отправляются, даже запланированные работают), а в основной программе, что долго гуляла по студиям - тишина, вообще ничего не происходит, даже ошибок никаких нет. То есть, код выполняется, но абсолютно безрезультатно. Скажите пожалуйста, с чем это может быть связано?

macOS Catalina 10.15 / PAServer 21.0 / RAD Studio 10.4

Изменено пользователем Алиса Романец
Изменение заголовка
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

×
×
  • Создать...