Firebase Cloud Messaging проект Android не отправляет push-уведомления

Вопрос:Я пытаюсь разработать приложение, в котором сервер должен отправлять уведомления всем устройствам Android, работающим с этим приложением каждые 5 секунд. Я решил использовать (Google) Firebse Cloud Messaging для отправки уведомлений, поэтому я сначала попробовал проект проекта руководства но я не могу заставить его работать. Я следовал всем инструкциям. Я опубликовал код, который я использовал.

Вопрос:

Я пытаюсь разработать приложение, в котором сервер должен отправлять уведомления всем устройствам Android, работающим с этим приложением каждые 5 секунд. Я решил использовать (Google) Firebse Cloud Messaging для отправки уведомлений, поэтому я сначала попробовал проект проекта руководства

но я не могу заставить его работать. Я следовал всем инструкциям. Я опубликовал код, который я использовал. Я также создал файл → структуру проекта → уведомления → в поле “Облачные сообщения Google” . Я попробовал приложение на устройстве Android 5.

Когда я открываю консоль Firebase и отправляю уведомление, я вижу обновленный токен в журнале (из MyFirebaseInstanceIDService class, method onTokenRefresh()), но когда я запускаю его снова и отправляю уведомление одному устройству копирование и вставка маркера ничего не происходит. Кроме того, когда я отправляю уведомление с консоли на сегмент пользователя, ничего не происходит снова.

Я также попробовал соответствующий проект примера ios для Firebase, с того же веб-сайта, и он отлично работал для iphone (все уведомления отправлены). Я что-то пропустил здесь?

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = «MyFirebaseIIDService»; @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, «Refreshed token: » + refreshedToken); sendRegistrationToServer(refreshedToken); } private void sendRegistrationToServer(String token) { // TODO: Implement this method to send token to your app server. } }

MyFirebaseMessagingService:

public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = «MyFirebaseMsgService»; @Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, «From: » + remoteMessage.getFrom()); //Toast.makeText(getApplicationContext(),»FROM «+remoteMessage.getFrom(),Toast.LENGTH_LONG).show(); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, «Message data payload: » + remoteMessage.getData()); //Toast.makeText(getApplicationContext(),»MESSAGE: «+remoteMessage.getData(),Toast.LENGTH_LONG).show(); } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { //MainActivity.TestMethod(); Log.d(TAG, «Message Notification Body: » + remoteMessage.getNotification().getBody()); //Toast.makeText(getApplicationContext(),»MESSAGE: «+remoteMessage.getData(),Toast.LENGTH_LONG).show(); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. sendNotification(remoteMessage.getNotification().getBody()); } private void sendNotification(String messageBody) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_stat_ic_notification) .setContentTitle(«FCM Message») .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } }

Основная деятельность:

public class MainActivity extends AppCompatActivity { private static final String TAG = «MainActivity»; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (getIntent().getExtras() != null) { for (String key : getIntent().getExtras().keySet()) { String value = getIntent().getExtras().getString(key); Log.d(TAG, «Key: » + key + » Value: » + value); } } Button subscribeButton = (Button) findViewById(R.id.subscribeButton); subscribeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // [START subscribe_topics] FirebaseMessaging.getInstance().subscribeToTopic(«news»); // [END subscribe_topics] // Log and toast String msg = getString(R.string.msg_subscribed); Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); Button logTokenButton = (Button) findViewById(R.id.logTokenButton); logTokenButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Get token String token = FirebaseInstanceId.getInstance().getToken(); // Log and toast String msg = getString(R.string.msg_token_fmt, token); Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); } }

и build.gradle(обмен сообщениями по проекту):

// Top-level build file where you can add configuration options commonto `all sub-projects/modules.` buildscript { repositories { jcenter() mavenLocal() } dependencies { classpath ‘com.android.tools.build:gradle:2.1.3’ classpath ‘com.google.gms:google-services:3.0.0’ // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() mavenLocal() } }

и build.gradle(приложение модуля):

apply plugin: ‘com.android.application’ android { compileSdkVersion 24 buildToolsVersion «24.0.0» defaultConfig { applicationId «com.google.firebase.quickstart.fcm» minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName «1.0» testInstrumentationRunner «android.support.test.runner.AndroidJUnitRunner» } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ } } packagingOptions { exclude ‘LICENSE.txt’ } } dependencies { compile fileTree(dir: ‘libs’, include: [‘*.jar’]) // Testing dependencies androidTestCompile ‘com.android.support.test.espresso:espresso-core:2.1’ androidTestCompile ‘com.android.support.test:runner:0.2’ androidTestCompile ‘com.android.support:support-annotations:24.2.0’ compile ‘com.android.support:appcompat-v7:24.2.0’ compile ‘com.google.firebase:firebase-messaging:9.4.0’ compile ‘com.google.firebase:firebase-core:9.4.0’ compile ‘com.google.android.gms:play-services-gcm:9.4.0’ compile ‘com.android.support:design:24.2.0’ } apply plugin: ‘com.google.gms.google-services’

… и вот файл манифеста:

<?xml version=»1.0″ encoding=»utf-8″?> <manifest xmlns:android=»http://schemas.android.com/apk/res/android» package=»com.google.firebase.quickstart.fcm»> <uses-permission android:name=»android.permission.INTERNET»/> <application android:allowBackup=»true» android:icon=»@mipmap/ic_launcher» android:label=»@string/app_name» android:theme=»@style/AppTheme»> <activity android:name=».MainActivity» android:label=»@string/app_name»> <intent-filter> <action android:name=»android.intent.action.MAIN» /> <category android:name=»android.intent.category.LAUNCHER» /> </intent-filter> </activity> <!— [START firebase_service] —> <service android:name=».MyFirebaseMessagingService»> <intent-filter> <action android:name=»com.google.firebase.MESSAGING_EVENT» /> </intent-filter> </service> <!— [END firebase_service] —> <!— [START firebase_iid_service] —> <service android:name=».MyFirebaseInstanceIDService»> <intent-filter> <action android:name=»com.google.firebase.INSTANCE_ID_EVENT» /> </intent-filter> </service> <!— [END firebase_iid_service] —> <activity android:name=».ResultActivity» android:label=»@string/title_activity_result» android:theme=»@style/AppTheme.NoActionBar»></activity> </application> </manifest> Лучший ответ:

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

Ответ №1

Возможно, вы пытаетесь получить уведомление, когда ваше приложение находится на переднем плане. Убедитесь, что он находится в фоновом режиме и повторите попытку. В противном случае вам необходимо следовать процедуре, чтобы получать уведомление, когда ваше приложение находится на переднем плане.

От Firebase Документация:
https://firebase.google.com/docs/cloud-messaging/android/receive

Уведомления Firebase ведут себя по-разному в зависимости от состояния переднего плана/фона получающего приложения. Если вы хотите, чтобы приложения с приложением получали уведомления или сообщения данных, вам нужно написать код для обработки обратного вызова onMessageReceived.

Отправка уведомления: https://firebase.google.com/docs/cloud-messaging/android/first-message

Отправить уведомление

  • Установите и запустите приложение на целевом устройстве.
  • Убедитесь, что приложение находится в фоновом режиме на устройстве.
  • Откройте вкладку “Уведомления” консоли Firebase и выберите “Новое сообщение”.
  • Введите текст сообщения.
  • Выберите единое устройство для цели сообщения.
  • В поле с надписью FCM Registration Token введите регистрационный токен, полученный в предыдущем разделе этого руководства.
Оцените статью
Добавить комментарий