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

Лидеры

Популярный контент

Показан контент с высокой репутацией 25.07.2020 во всех областях

  1. Есть приложение, написанное ещё в 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
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...