Отправка push-уведомления Firebase Cloud Messaging не из консоли
Попробовал прикрутить к своему Android-приложению FCM, частично получилось - при создании уведомления в консоли Firebase уведомления приходят на девайс, однако хочу чтобы при определенном действии в приложении на остальные девайсы отсылалось push-уведомление об этом действии.
Для начала я решил использовать CURL для симуляции отправки сообщений, по логам сообщения обрабатываются в методе onMessageReceived(RemoteMessage remoteMessage), однако push-уведомления не появляются.
Сервис в AndroidManifest
<service android:name=".Service.MessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
При регистрации подписываю устройства на канал "test"
FirebaseMessaging.getInstance().subscribeToTopic("test");
Метод onMessageReceived
public void onMessageReceived(RemoteMessage remoteMessage) {
showNotification (remoteMessage.getData().get("title"), remoteMessage.getData().get("context"));
}
Отправляю запрос через PHP-скрипт
<?php
// API access key from Google API's Console
define( 'API_ACCESS_KEY', 'AIzaSyB4ZanJWaCay_fXxO5z0jI55T8UOwdGNNQ' );
// prep the bundle
$msg = array
(
'user' => 'somebody',
'title' => 'This is a title. title',
'context' => 'here is a message. message',
'vibrate' => 1,
'sound' => 1
);
$fields = array
(
'to' => '/topics/test',
'data' => $msg
);
$headers = array
(
'Authorization: key=' . API_ACCESS_KEY,
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );
echo $result;
?>
Выполняя этот запрос получаю
{"message_id":5069819597562559135}
Причем данные, которые отправляются в запросе, приложение получает, но push-уведомление отсутствует. Из-за чего от моих запросов не появляются push-уведомления?
Ответы (1 шт):
Решил проблему, оказывается на ОС версии ниже 8 все работает прекрасно, но выше работать не будет (без дополнительных телодвижений).
В 8 версии андроида добавили такую штуку как "Каналы". Если ваше уведомление не относится ни к одному из каналов - оно не отобразится. Почитать поподробнее можно вот тут.
Починил свою проблему следующим образом:
- Добавил название канала в ресурсы
<string name="default_notification_channel_id" translatable="false">fcm_default_channel</string>
- Добавил мета-данные в манифест проекта
<application>
...
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/default_notification_channel_id"/>
</application>
- Теперь перед вызовом уведомления (notificationManager.notify) будем присваивать уведомлению наш канал
...настройка notificationManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String channelId = context.getString(R.string.default_notification_channel_id);
NotificationChannel channel = new NotificationChannel(channelId, title, NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription(body);
mNotificationManager.createNotificationChannel(channel);
builder.setChannelId(channelId);
}
notificationManager.notify(1, notification);