Expo Push-уведомления не появляются в телефонах Android (плавающие уведомления)

EDIT: я обнаружил, что они известны как плавающие уведомления. Кто-нибудь знает, как включить их по умолчанию из приложения (через разрешение и т. д.) На устройстве Android?

в настоящее время я тестирую push-уведомления на устройстве Android и заметил, что, хотя я получаю push-уведомления, они не появляются на экране, но остаются в фоновом режиме (мне нужно перетащить верхнюю строку состояния в соответствии с изображением). Я вижу, что это довольно бесполезно, поскольку пользователь на самом деле не уведомление, если он использует телефон:

enter image description here

на iPhone всплывающее окно отображается правильно без каких-либо проблем.

2 ответов


я, наконец, сделал это, используя Expo.Notifications.createChannelAsync используя priority: "max" и при отправке сообщения добавить channelId: "mychannel".


чтобы показать так называемое плавающее уведомление, приложение должно иметь разрешение SYSTEM_ALERT_WINDOW.

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




проверьте, если у вас уже есть разрешение

рекомендуемый способ сделать это, используя настройки#canDrawOverlays (контекст).Это разрешение вводится только на уровне API 23. Поэтому в соответствии с doc нет необходимости проверять разрешение на старых устройствах.

однако видно, что это не будет работать хорошо, как ожидалось в некоторых устройствах pre-Marshmallow, таких как Xiaomi Mi 2. Так что лучше сделать это, как показано в этот пост.

возьмите пользователя на страницу настроек, если нет разрешения

Если приложение нацелено на уровень API 23 или выше, пользователь приложения должен явно предоставить это разрешение приложению через экран управления разрешениями. Приложение запрашивает одобрение пользователя, отправив намерение с действием настройки.ACTION_MANAGE_OVERLAY_PERMISSION.

Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setData(Uri.parse("package:" + context.getPackageName()));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent);