2017-01-24 17 views
2

У меня возникла проблема с отправкой push-уведомлений на устройство Android с консоли Firebase. Specifically, Firebase is not attempting to send the notification. Связанное изображение показывает, что я вижу на консоли, после отправки уведомления (завершенный статус, дата доставки, соответствующая времени, которое я отправил, но ничего не отправлено).Firebase Отправка уведомлений с консоли

Первоначально я обнаружил эту проблему в своем приложении, но перешел к тестированию проблемы с Firebase's demonstration app, но безрезультатно. Я могу получить токены регистрации FCM без проблем, поэтому есть подключение к Firebase. Я в первую очередь тестирую эмулятор в Android Studio с API 25, но я также тестировал эмуляторы с API 17 и 23, а также личные Android-устройства с API 17 и 23. Я пробовал различные Firebase/Google Воспроизведите версии от 9.0.2 до текущего 10.0.1. Я также не изменил код в демонстрационном приложении Firebase (кроме зависимостей в build.gradle и манифесте в попытках решить мою проблему).

Что делает эту проблему еще более странной, так это то, что эти уведомления в конечном итоге отправляются, но для этого требуется ненормально длительное время, и это всегда происходит после закрытия приложения/эмулятора, поэтому я их никогда не видел. Иногда это занимает несколько часов, но часто это происходит только на следующий день, когда я смотрю на консоль и вижу, что она отправлена. Первоначально я сделал это до простой задержки, но за последние полтора недели я отправил 50+ тестовых уведомлений, и все они столкнулись с этой проблемой.

Это то, что только те файлы, я сделал какие-либо изменения в настоящее время выглядят как (последнее уведомление тест был отправлен в эмуляторе с API 25):

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.google.firebase.quickstart.fcm"> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme"> 
    <!-- [START fcm_default_icon] --> 
    <!-- Set custom default icon. This is used when no icon is set for incoming notification messages.--> 
    <meta-data 
     android:name="com.google.firebase.messaging.default_notification_icon" 
     android:resource="@drawable/ic_stat_ic_notification" /> 
    <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming 
     notification message.--> 
    <meta-data 
     android:name="com.google.firebase.messaging.default_notification_color" 
     android:resource="@color/colorAccent" /> 
    <!-- [END fcm_default_icon] --> 
    <activity 
     android:name="com.google.firebase.quickstart.fcm.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] --> 
</application> 

Проект build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

buildscript { 
    repositories { 
     jcenter() 
     mavenLocal() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.2.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() 
    } 
} 

App build.gradle

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.0" 

    defaultConfig { 
     applicationId "com.google.firebase.quickstart.fcm" 
     minSdkVersion 14 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 

     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 

buildTypes { 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    packagingOptions { 
     exclude 'LICENSE.txt' 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:25.0.1' 

    compile 'com.google.firebase:firebase-messaging:9.6.0' 

    // Testing dependencies 
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' 
    androidTestCompile 'com.android.support.test:runner:0.5' 
    androidTestCompile 'com.android.support:support-annotations:25.0.1' 
} 

apply plugin: 'com.google.gms.google-services' 

Любая помощь или проницательность кто-нибудь может дать бы много appreicated. Благодаря!

EDIT 1:

MyFirebaseInstanceIDService.java

По желанию, здесь реализации услуг. Следует отметить, что они не отличаются от стандартной версии, связанной в пункте 2.

/** 
* Copyright 2016 Google Inc. All Rights Reserved. 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
* http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.google.firebase.quickstart.fcm; 

import android.util.Log; 

import com.google.firebase.iid.FirebaseInstanceId; 
import com.google.firebase.iid.FirebaseInstanceIdService; 


public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { 

private static final String TAG = "MyFirebaseIIDService"; 

/** 
* Called if InstanceID token is updated. This may occur if the security of 
* the previous token had been compromised. Note that this is called when the InstanceID token 
* is initially generated so this is where you would retrieve the token. 
*/ 
// [START refresh_token] 
    @Override 
    public void onTokenRefresh() { 
     // Get updated InstanceID token. 
     String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 
     Log.d(TAG, "Refreshed token: " + refreshedToken); 

     // If you want to send messages to this application instance or 
     // manage this apps subscriptions on the server side, send the 
     // Instance ID token to your app server. 
     sendRegistrationToServer(refreshedToken); 
    } 
    // [END refresh_token] 

    /** 
    * Persist token to third-party servers. 
    * 
    * Modify this method to associate the user's FCM InstanceID token with any server-side account 
    * maintained by your application. 
    * 
    * @param token The new token. 
    */ 
    private void sendRegistrationToServer(String token) { 
     // TODO: Implement this method to send token to your app server. 
    } 
} 

MyFirebaseMessagingService.java

/** 
* Copyright 2016 Google Inc. All Rights Reserved. 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
* http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.google.firebase.quickstart.fcm; 

import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.media.RingtoneManager; 
import android.net.Uri; 
import android.support.v4.app.NotificationCompat; 
import android.util.Log; 

import com.google.firebase.messaging.FirebaseMessagingService; 
import com.google.firebase.messaging.RemoteMessage; 

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

    private static final String TAG = "MyFirebaseMsgService"; 

    /** 
    * Called when message is received. 
    * 
    * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. 
    */ 
    // [START receive_message] 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     // [START_EXCLUDE] 
     // There are two types of messages data messages and notification messages. Data messages are handled 
     // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type 
     // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app 
     // is in the foreground. When the app is in the background an automatically generated notification is displayed. 
     // When the user taps on the notification they are returned to the app. Messages containing both notification 
     // and data payloads are treated as notification messages. The Firebase console always sends notification 
     // messages. 
     // [END_EXCLUDE] 

     // TODO(developer): Handle FCM messages here. 
     // Not getting messages here? See why this may be: 
     Log.d(TAG, "From: " + remoteMessage.getFrom()); 

     // Check if message contains a data payload. 
     if (remoteMessage.getData().size() > 0) { 
      Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
     } 

     // Check if message contains a notification payload. 
     if (remoteMessage.getNotification() != null) { 
      Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); 
     } 

     // 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()); 
    } 
    // [END receive_message] 

    /** 
    * Create and show a simple notification containing the received FCM message. 
    * 
    * @param messageBody FCM message body received. 
    */ 
    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()); 
    } 
} 

EDIT 2:

Я хотел бы добавить, что onMessageReceived никогда срабатывает.

+0

Разместить свои реализации услуг, поэтому мы можем видеть, что происходит. –

+0

@HristoStoyanov Я добавил его, хотя я должен отметить, что он ничем не отличается от версии запаса, которую я связал. – David

+0

Почему вы используете более старую версию библиотеки, попробуйте с 10.0.1 –

ответ

0

В ваших зависимостях в сборке.Gradle добавить следующее:

//Used for firebase services 
compile 'com.google.firebase:firebase-core:10.0.1' 

EDIT:

Обычно следующее в build.gradle вашего приложения

//Used for firebase services 
compile 'com.google.firebase:firebase-core:10.0.1' 
//Used for push notification services 
compile 'com.google.firebase:firebase-messaging:10.0.1' 

И следующее build.gradle вашего суперпользователя

classpath 'com.google.gms:google-services:3.0.0' 

И google-services.json, которые вы создали, указав название своего пакета и sha1 ke y вы должны иметь возможность получать push-уведомления, отправленные из firebase. Проверьте еще раз, если вы скопировали правильный ключ sha1 и не SHA256 ни mda5 ключ

+0

К сожалению, я уже пробовал это без везения. – David

+0

Вы скопировали сгенерированный google-services.json в папку приложения? – thushcapone

+0

Я сделал это, это была одна из первых вещей, которые я искал – David