Jump to content
View in the app

A better way to browse. Learn more.

FGX Native

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.
  • Status: Open
  • Priority: Critical
  • Resolution: Unresolved
  • Platform: Android, iOS
  • Affects version 1.18.13.0

И как то странно работает пример локальных уведомлений. Под android уведомления приходят, но на версии 9.0 не приходит сообщение при нажатии на уведомлении (OnReceiveLocalNotification)

А на IOS при нажатии на кнопку что-то пиликает, но никакого уведомления в шторке или где-то еще нет. Так и должно быть?

И в проекте явно не хватает разрешения на отправку уведомлений. Без этого приложение под android при нажатии на кнопки пишет что нет разрешения и дать разрешение приложению вообще нет возможности.

User Feedback

Recommended Comments

  • Administrators

А на IOS при нажатии на кнопку что-то пиликает, но никакого уведомления в шторке или где-то еще нет. Так и должно быть?

На iOS уведомление не показывается пока вы в приложении. У Apple следующая логика: Уведомления разработаны для уведомления пользователя, когда он не в приложении. В других случаях разработчик должен использовать другие средства для информирования пользователя пока он в приложении, чтобы не делать из центра уведомлений помойку.

И в проекте явно не хватает разрешения на отправку уведомлений. Без этого приложение под android при нажатии на кнопки пишет что нет разрешения и дать разрешение приложению вообще нет возможности.

Нужно добавить в манифест уведомление POST_NOTIFICATION и запросить нужные разрешения в рантайме: NotificationC.RequestPermission;.

И как то странно работает пример локальных уведомлений. Под android уведомления приходят, но на версии 9.0 не приходит сообщение при нажатии на уведомлении (OnReceiveLocalNotification)

Только что проверил на Android 11. При нажатии на уведомление в центре уведомлений оно появляется в мемо (не зависимо от текущего состояния приложения)

Mineev

Active subscription
41 минуту назад, Yaroslav Brovin сказал:

Только что проверил на Android 11. При нажатии на уведомление в центре уведомлений оно появляется в мемо (не зависимо от текущего состояния приложения)

На android 14 у меня тоже всё работает. А вот на версии 9.0 в эмуляторе в memo ничего почему-то не прилетает

43 минуты назад, Yaroslav Brovin сказал:

На iOS уведомление не показывается пока вы в приложении. У Apple следующая логика: Уведомления разработаны для уведомления пользователя, когда он не в приложении. В других случаях разработчик должен использовать другие средства для информирования пользователя пока он в приложении, чтобы не делать из центра уведомлений помойку.

Вот как раз об этом я тоже хотел спросить. Я тут разговаривал с разработчиками нативных IOS приложений на свифте и они утверждают (и демонстрируют) что у них пуши всегда прилетают в шторку не зависимо от того запущено ли приложение или нет. Почему у нас не так? (Собственно это я и хотел реализовать у себя через локальные уведомления)

То, что вы пишете совершенно не логично и не понятно. Вот давайте разберем на таком примере: Есть приложение и в нем есть, например, какие-то акции. На сервере добавили новую акцию. Пользователя приложения нужно проинформировать об этом. Если приложение не запущено, прилетает пуш в шторку. Пользователь это видит, нажимает на него, запускается приложение и открывается окно с описанием новой акции. Если же приложение запущено и пользователь что-то в нем делает как я как разработчик должен информировать его о новой акции? Если сразу я открою окно с новой акцией, то пользователь обложит меня матом поскольку он в этот момент осознанно что-то делал в приложении и не хотел чтобы его прерывали. Проверено на практике. Показать тост?! Он не заметит его или забудет о нём через минуту. Вот уведомление в шторке как раз идеальный вариант в этом случае. Оно никуда не денется и дождется пользователя. Потом пользователь закончит свои дела в приложении, откроет шторку и увидит новую акцию, а при нажатии уже откроется подробное описание. Всё удобно и знакомо, всем хорошо.

Как делать это по другому если есть стандартный, удобный, всем известный механизм?

  • Administrators
1 hour ago, Mineev said:

Вот как раз об этом я тоже хотел спросить. Я тут разговаривал с разработчиками нативных IOS приложений на свифте и они утверждают (и демонстрируют) что у них пуши всегда прилетают в шторку не зависимо от того запущено ли приложение или нет. Почему у нас не так? (Собственно это я и хотел реализовать у себя через локальные уведомления)

Для начала нужно определиться вы о локальном уведомлении или о пуш?

2 hours ago, Mineev said:

Вот как раз об этом я тоже хотел спросить. Я тут разговаривал с разработчиками нативных IOS приложений на свифте и они утверждают (и демонстрируют) что у них пуши всегда прилетают в шторку не зависимо от того запущено ли приложение или нет. Почему у нас не так? (Собственно это я и хотел реализовать у себя через локальные уведомления)

Пуши "не прилетают в шторку не зависимо от того запущено ли приложение или нет". По умолчанию работает именно так, как я написал выше. Однако, начиная с iOS 10 был добавлен дополнительный метод делегата, который позволяет управлять обработкой локального уведомления.

https://developer.apple.com/documentation/usernotifications/handling-notifications-and-notification-related-actions?language=objc#Handle-notifications-while-your-app-runs-in-the-foreground

Мы этот метод используем:

procedure TfgiOSNotificationCenterDelegate.userNotificationCenter(center: UNUserNotificationCenter;
  notification: UNNotification; completionHandler: Pointer);

  function HasContentAvailable(const AUserInfo: NSDictionary): Boolean;
  var
    APS: Pointer;
    ContentAvailable: Pointer;
  begin
    Result := False;
    APS := AUserInfo.valueForKey(StrToNSStr('aps'));
    if APS <> nil then
    begin
      ContentAvailable := TNSDictionary.Wrap(APS).valueForKey(StrToNSStr('content-available'));
      if ContentAvailable <> nil then
        Result := TNSNumber.Wrap(ContentAvailable).intValue = 1;
    end;
  end;

  function ContentToPresentationOptions(const AContent: UNNotificationContent): UNNotificationPresentationOptions;
  begin
    Result := UNNotificationPresentationOptionAlert;
    if AContent.sound <> nil then
      Result := Result or UNNotificationPresentationOptionSound;
    if AContent.badge <> nil then
      Result := Result or UNNotificationPresentationOptionBadge;
  end;

var
  CompletionHandlerImpl: procedure(options: UNNotificationPresentationOptions); cdecl;
  Content: UNNotificationContent;
  Options: UNNotificationPresentationOptions;
  IsPushNotification: Boolean;

  LNotification: UNNotification;
  LCompletionHandler: Pointer;
begin
  LNotification := notification;
  LCompletionHandler := completionHandler;

  Content := LNotification.request.content;

  // We catch notification with "content-available" flag in applicationDidReceiveRemoteNotificationWithFetchCompletionHandler
  IsPushNotification := (Content.userInfo <> nil) and not HasContentAvailable(Content.userInfo);
  if IsPushNotification then
    PushNotificationReceived(LNotification);

  @CompletionHandlerImpl := imp_implementationWithBlock(LCompletionHandler);
  try
    Options := ContentToPresentationOptions(Content);
    if IsPushNotification then
      Options := Options - UNNotificationPresentationOptionAlert;

    CompletionHandlerImpl(Options);
  finally
    imp_removeBlock(@CompletionHandlerImpl);
  end;
end;

Для Пуш уведомлений мы не показываем его в шторке, так как пуш прилетает прямо в компонент сервиса по работе с уведомлениями. А вот локальные должны попадать в шторку. В принципе, можем сделать широковещательную рассылку сообщения (только под iOS), чтобы можно было переопределять состав флагов.

Центр уведомлений TNotificationCenter - это разработка Embarcadero. В те времена, когда она была добавлена (~iOS 5), центр уведомлений был ограничен по функционалу.

2 hours ago, Mineev said:

То, что вы пишете совершенно не логично и не понятно.

Вы задали вопрос, я вам ответил. После вы начинаете со мной дискутировать на тему, что это не логично. Я думаю вы должны понимать, что я не правильный адресат для спора, почему в Apple делают "не логично". Я думаю, вы можете обратиться с этим вопросом в службу поддержки разработчиков Apple, где они, возможно, могут поделиться с вами своими доводами.

2 hours ago, Mineev said:

Если же приложение запущено и пользователь что-то в нем делает как я как разработчик должен информировать его о новой акции?

На то вы и разработчик, чтобы принимать решения. Разные приложения используют разные подходы: начиная от тостов с возможностью перехода по их нажатию и, продолжая локальным центром уведомлений внутри приложения.

2 hours ago, Mineev said:

Если сразу я открою окно с новой акцией, то пользователь обложит меня матом поскольку он в этот момент осознанно что-то делал в приложении и не хотел чтобы его прерывали.

Теперь представьте ситуацию, когда каждое приложение в системе шлет вам бестолковые нотификации о бесполезных (в большинстве случаях) акциях. И вы как пользователь обматерите приложение и просто запретите ему слать любые нотификации в центр уведомлений. И если вы проследите историю разработки локальных уведомлений, в том же Андроиде или iOS, где с уведомлениями совсем была беда в старых версиях. Шторка уведомлений выглядела, как война и мир. Дальше в Гугл решили ввести понятие каналов, чтобы пользователь хоть как-то мог фильтровать бесполезные сообщения и оставлять только те, что ему реально нужны. Но не смотря на это, лично у меня даже не телефоне, который я использую ТОЛЬКО для разработки, вся шторка - это набор бесполезных уведомлений. Вот вам другая точка зрения.

2 часа назад, Mineev сказал:

Вот уведомление в шторке как раз идеальный вариант в этом случае. Оно никуда не денется и дождется пользователя. Потом пользователь закончит свои дела в приложении, откроет шторку и увидит новую акцию, а при нажатии уже откроется подробное описание. Всё удобно и знакомо, всем хорошо.

То есть пользователь работает в вашем приложении, потом его закрывает - завершает с ним работу (а не открывает шторку, чтобы посмотреть уведомление от приложения в котором Удобно :-) Но вы явно переоцениваете важность акции, как и любой рекламы в центре уведомления.

P.S. Сразу вспоминается старое приложение Яндекс.Маркет, где грамотные маркетологи в погоне за продажами решили в центр уведомлений слать вместе со статусами заказов свои акции. В итоге либо ты получаешь и Акции и Статусы заказов (выбрать нельзя), либо просто отключаешь уведомления, что я и сделал. Сейчас правда они добавили возможность отключать уведомления для категорий. Приблизительно такая же ситуация и в озон и вайлдбери приложениях была.

  • Administrators

И последнее, текущая реализация TNotificationCenter в делфи на мой взгляд устаревшая. И этот компонент требует переработки. Поскольку это часть RTL, мы не можем вносить в него изменения. Поэтому остается только разработка нового. Но это пока не стоит в планах.

Mineev

Active subscription
14 часов назад, Yaroslav Brovin сказал:

Для начала нужно определиться вы о локальном уведомлении или о пуш?

Здесь речь шла о пушах.

15 часов назад, Yaroslav Brovin сказал:

А вот локальные должны попадать в шторку.

Так должны или не должны? Я запутался. При запущенном приложении под IOS локальные уведомления должны попадать в шторку? У меня не попадают.

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

13 часов назад, Yaroslav Brovin сказал:

текущая реализация TNotificationCenter в делфи на мой взгляд устаревшая. И этот компонент требует переработки.

Это печально!

  • Administrators
2 часа назад, Mineev сказал:

Так должны или не должны? Я запутался. При запущенном приложении под IOS локальные уведомления должны попадать в шторку? У меня не попадают.

Выдержка из документации, ссылку на которую я выслал выше:

Handle notifications while your app runs in the foreground

If a notification arrives when your app is running in the foreground, the system delivers that notification directly to your app. Upon receiving a notification, you can use the notification’s payload to do whatever you want. For example, you can update your app’s interface to reflect new information contained in the notification. You can then suppress any scheduled alerts or modify those alerts.

По умолчанию локальное уведомление НЕ попадает в шторку, если приложение активно. НО система позволяет переопределить это поведение по умолчанию при помощи метода userNotificationCenter:willPresentNotification:withCompletionHandler: делегата. Мы этот метод используем, код его я выслал выше. И в нем мы для пушей не показываем Alert тип, а для не пуш уведомлений показываем. Если что Alert - это не шторка - а отображение уведомления в виде всплывающего диалога (но опять же отображение алерта зависит от глобальных настроек уведомлений на телефоне пользователя, так и от локальных на уровне приложения. Если алерт выключен, то уведомление не появится). Но в теории, можно поменять это поведение на то, чтобы уведомление падало в шторку.

Create an account or sign in to comment

Recently Browsing 0

  • No registered users viewing this page.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.