Перейти к содержанию
  • 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 эмодзи.

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

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

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


  • Похожий контент

    • От Eric Myval
      Сегодня начал разбираться с компиляцией под Mac и под iOS и сразу столкнулся с проблемами. Использую Rad Studio 10.3.3, Mac Mini 10.15.1, Windows 10. PAServer20.0, Xcode 11.2.1 Выдает следующую ошибку на всех платформах, как iOS, так и iOS Simulator, macOS32 - 
      Unable to launch process on '192.168.8.182' using the parameters from the 'MacMini' profile. The following error was returned: 'Unable to create process: /Applications/PAServer-20.0.app/Contents/MacOS/dbkosx_26_0 Получается собрать проект только в macOS64, но! Приложения запускаются, работают, но после их закрытия в отладке, пишет, что ПО устаревшие и кидает ссылку на переход с 32 на 64. Но как так? Оно же собрано на 64х))) В общем, полный тупик и убил весь день. Есть идеи? 
    • От Алиса Романец
      Доброго времени суток, форумчане!
      Есть программка, которая имеет свой конфиг. И если на винде, я могу спокойно складировать этот конфиг в папку C:\ProgramData, то с маком всё сложнее. Просто так записать конфиг и папку в /Library/Application Support/ не получится, требуются права администратора. Замучавшись с попытками сохранения конфига в эту папку, я решила пойти другим путём и заставила программу сохранять этот конфиг (вместе с последующими генерируемыми программой файлами) внутрь себя (MyProgramm.app/Contents/MacOS). Первое время всё работало нормально, файлы сохранялись, генерировались в саму программу. Но, как обычно бывает, что-то пошло не так и... В результате, сейчас я имею то, что программа при первом запуске из RAD генерирует первый конфиг в себя (MyProgramm.app/Contents/MacOS/Config.cfg), запускается при запуске из RAD. НО, стоит мне запустить её независимо от студии (в надеждах, что она считает конфиг внутри себя, как она делала раньше), как она просто падает. Добавив небольшое ShowMessage(FileExists('Config.cfg').ToString()); в качестве отладки, я узнаю, что она падает из-за того, что НЕ МОЖЕТ НАЙТИ ФАЙЛ КОНФИГА, ЧТО НАХОДИТСЯ В НЕЙ САМОЙ. Затем, методом тыка было обнаружено, где именно он пытается найти этот файл - в корне диска с системой. Вопрос к вам, как пофиксить это дерьмо? 
      Сразу скажу, код со вчерашнего дня вообще не менялся. Фрагмент работы с конфигом я приложила ниже.
      procedure TForm1.FormCreate(Sender: TObject); var PRGP, OUTP: String; i: Integer; begin {тут находится код для MSWINDOWS} {$IFDEF POSIX} AssignFile (CFG, 'AErenderConfiguration.cfg'); //Привязка файла, что по идее должен быть внутри софта if FileExists ('AErenderConfiguration.cfg') then //Тут ошибка вылезает, потому что он не может найти файл в корне диска begin //Чтение самого конфига Reset (CFG); Readln (CFG, LANG); Readln (CFG, PRGP); Readln (CFG, OUTP); Readln (CFG, AERPATH); Readln (CFG, DEFPRGPATH); Readln (CFG, DEFOUTPATH); projectPath.Text := PRGP; outputPath.Text := OUTP; Lang1.Lang := LANG; CloseFile (CFG); end else begin //Действия, если конфиг не существует. Тоже ошибка, потому что в macOS корень диска заблокирован для записи. Rewrite (CFG); for i := 1 to 6 do Writeln (CFG, ' '); LANG := 'EN'; Lang1.Lang := LANG; CloseFile (CFG); end; {$ENDIF POSIX} RAD Studio 10.3 Rio (26.0.32429.4364), PAServer 20.0, macOS 10.13.6 High Sierra (MacBook 13" Mid 2010). 
    • От long_island
      Всем привет. Встал вопрос после обновления MacOS до High Sierra. Ранее для работы приложения через https из коробки работал Indy в RAD Studio 10.0. После обновления MacOS стала появляться ошибка о невозможности подгрузить библиотеку OpenSSL. Понял, что в обновленной MacOS теперь используется LibreSSL и из коробки теперь не работает. Перерыл тонну материала, но вопрос остался не решенным. Надеюсь, что кто - то имеет какие - то догадки в этом направлении.
    • От AliZairov
      Привет. Я сделал macos установку web installer с Delphi Berlin.

      Программа дает .bpl ошибка открытия файла.

    • От notricky
      Собственно зазипованый файл качается, разархивируется и все файлы помещаются в папку.
      Ну а дальше приложение не запускается, хотя:
       - Настройки безопасности настроены на установку из любых мест
       - Встроенный архиватор разархивирует в папку и "из-под" него приложение запускается (до настроек безопасности просто выдавало ошибку "неизвестный автор" и "у вас настроено только на аппстор или известных авторов").
       - Разумеется при деплое приложения работают. Если их просто скопировать на флешку и потом закопировать обратно - тоже работают.
      Следовательно проблема при разархивировании программно. Что-то нужно добавить. Есть понимание что именно? 
      Сам нетривиальный код:
      var z: TZipFile; begin try {$IFDEF MSWINDOWS} RenameFile(ParamStr(0),ExtractFileName(ParamStr(0)) + '.old'); Application.ProcessMessages; {$ENDIF} SetLength(Result, 1); Result[0] := ''; z := TZipFile.Create; z.Open(ZipFile, zmRead); z.ExtractAll(ExtractTo); Result := z.FileNames; finally z.Close; z.Free; end; end; В архив кладу:
       - .app взятый с мака (а по другому никак)
       - .entitlements
       - .DS_Store 
      В надобности последнего я сильно сомневаюсь.
       
    • От Alex7wrt
      На MacOS и iOS вылетает приложение при попытке чтения из ресурса.
      Этот код нормально работает на Windows и Android, а на MacOs и iOS приводит к вылету приложения.
      procedure TForm1.Button1Click(Sender: TObject); var rs: TResourceStream; begin rs:=TResourceStream.Create(0,'png1',PChar(RT_RCDATA)); image1.Bitmap.LoadFromStream(rs); rs.Free; end;
      В чем может быть причина?
    • От Alex7wrt
      Добрый день.
      Пытаюсь запустить приложение на IOS симуляторе. При компиляции выскакивает сообщение:

      При этом на MacOS приложения запускаются нормально.
      В чем может быть проблема?
      Berlin Update 1. XCode 8.1. PAServer 18.0
    • От Равиль Зарипов (ZuBy)
      DeviceInfo - модуль для получения информации о девайсе
      Android || Windows || IOS || MAC OS
        

      Intel планшет

      для Андроида нужно включить разрешения (permission)
      Ссылка на GitHub
    • От Равиль Зарипов (ZuBy)
      Шаблон проекта с кастомным шрифтом FontAwesome
      Намного удобней и менее затратно использовать Шрифт с Иконками, чем заботиться о качестве картинок, скейлах, их хранении и загрузке
      Поэтому давно перешел на шрифты, пару скриншотов (без использования картинок)

      Seattle CustomFont.7z
      Berlin CustomFont(Berlin).zip
       
      WINDOWS/MACOS - установить шрифт в систему
      IOS - в деплой добавить шрифт и с помощью IOS9Fix прописать в .plist следующее:
      ANDROID - в деплой добавить шрифт (Remote Path -> assets\internal) и подключить к проекту измененные файлы FMX.FontGlyphs.Android.pas, FMX.FontGlyphs.pas
    • От Rusland
      Пытаюсь из сервиса выдать уведомление: 
      procedure TAndroidServiceDM.SendNotify(AlertName,AlertBody:String); var Notification: TNotification; begin Notification := NotificationC.CreateNotification; try Notification.Name := AlertName; Notification.AlertBody := AlertBody; Notification.FireDate := Now; NotificationC.ScheduleNotification(Notification); finally Notification.DisposeOf; end; end; ... // пытаюсь вызвать SendNotify('Attention','Тревога'); Вроде не UI использую, но получаю ошибку Segmentation fault 11.
      Ошибка происходит в System.Android.Notification в строке 208-209
      LaunchIntent := TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage(TAndroidHelper.Context.getPackageName()); AIntent.putExtra(TJNotificationInfo.JavaClass.EXTRA_ACTIVITY_CLASS_NAME, LaunchIntent.getComponent().getClassName()); Снова похоже на обращение к Activity (а может что-то другое).
       
      Есть решение как обойти эту проблему?
       
       
      PS. Delphi RX
  • Последние посетители   0 пользователей онлайн

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

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