2017-01-24 9 views
2

Firebaseコンソールからアンドロイドデバイスにプッシュ通知を送信する際に問題があります。 リンクされた画像は、通知を送信したときにコンソールから表示されるものを示します(完了ステータス、送信日時に対応する配信日ですが、実際には送信されません)。Firebaseがコンソールからの通知を送信しない

私は自分のアプリでこの問題を最初に発見しましたが、問題をFirebase's demonstration appでテストしましたが、役に立たなかった。問題なくFCM登録トークンを取得できますので、Firebaseとの接続があります。私は主にAndroid StudioのエミュレータをAPI 25でテストしていますが、API 17と23のエミュレータと、API 17と23のパーソナルアンドロイドデバイスもテストしました。Firebase/Googleバージョン9.0.2から現在の10.0.1までのバージョンを再生します。私はFirebaseデモアプリケーションのコードも変更していません(build.gradleの依存関係と私の問題解決のためのマニフェスト以外)。

これらの通知は最終的に送信されますが、異常に長い時間がかかり、アプリケーション/エミュレータが閉じられた後はいつもそうです。実際には見たことはありません。時には数時間かかることもありますが、翌日までコンソールを見て、それが送信されていることを確認することはしばしばありません。当初、私はこれを単純な遅延にまで控えましたが、私は過去1週間半に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

の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

ポストあなたのサービスの実装キーMDA5をSHA256場合は、再度確認してください、私たちは何が起こっているかを見ることができます。 –

+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を与えますあなたはfirebaseから送信されたプッシュ通知を受信できるはずです。あなたは正しいSHA1キーをコピーしたとしませ

+0

残念ながら、私はすでに運が無ければこれを試しました。 – David

+0

生成されたgoogle-services.jsonをアプリフォルダにコピーしましたか? – thushcapone

+0

私が探した最初のものの1つでした – David

関連する問題