Firebase控制台未发送通知

3

我在Firebase控制台上向安卓设备发送推送通知时遇到了问题。具体来说,Firebase并没有尝试发送通知。链接的图片展示了我在发送通知后在控制台中看到的情况(完成状态,配合我发送时间的日期,但实际上没有发送任何内容)。

我最初是在自己的应用程序中发现了这个问题,但后来转而使用Firebase演示应用程序测试,但无济于事。我可以无问题地获取FCM注册令牌,因此与Firebase有连接。我主要在Android Studio中的模拟器上进行测试,API版本为25,但我也在API 17和23的模拟器以及具有API 17和23的个人Android设备上进行了测试。我尝试了各种Firebase / Google Play版本,从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()
    }
}

应用程序 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'

任何人能够提供的帮助或见解都将不胜感激,谢谢!编辑1:

MyFirebaseInstanceIDService.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.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());
    }
}

编辑2:

我应该补充说明的是,onMessageReceived从未被触发。


发布您的服务实现,这样我们就可以看到发生了什么。 - Hristo Stoyanov
@HristoStoyanov 我已经添加了它,尽管我应该指出它与我链接的原始版本没有任何区别。 - David
为什么你在使用旧版本的库?尝试使用10.0.1版本。 - Hristo Stoyanov
1
你找到解决方案了吗? - Mohammad Yahia
1
很遗憾,我还是不知道出了什么问题。我只好创建一个自定义的消息协议。 - David
显示剩余2条评论
2个回答

0

与IOS设备一起工作。
我的问题是我没有在Firebase控制台中上传APNs文件。

前往Firebase控制台:
--> 设置
--> 项目设置
--> 云消息传递
--> iOS应用程序配置
--> 上传APNs


0
在你的 build.gradle 的 dependencies 中添加以下内容:
//Used for firebase services
compile 'com.google.firebase:firebase-core:10.0.1'

编辑:

通常在您的应用程序的 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密钥,你应该能够接收从firebase发送的推送通知。再次检查是否已复制正确的sha1密钥,而不是sha256mda5密钥。


你是否将生成的google-services.json文件复制到应用程序文件夹中了? - thushcapone
我做了,那是我最先寻找的事情之一。 - David
你的编辑很有帮助,因为我没有考虑到SHA1密钥的问题。尽管我已经检查过了,但不幸的是,这也不是问题所在。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接