2016-09-04 22 views
1

AndroidのFCM通知に苦労しています。この問題は、アプリが閉じられていて実行されていない場合にのみ発生します。私はクリックのアクティビティを達成しようとしていますが、私はアプリを開きたくないので、メッセージが消えないようにしたいと思います。アプリが開いて動作しているときは完全に機能します。アプリが開いていないときは、まだ通知が届いていますが、通知は複数行になっていないため、通知の開始部分のみが表示されます。その後、通知をクリックすると消えます。私は何時間も働いて解決策を見つけようと努力してきました。ここに私がこれまでに持っているコードはあります:Android FCM通知の問題

private void sendNotification(String messageBody) { 

    //Intent intent = new Intent(this, MainActivity.class); 
    // intent.setFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); 
    //PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 
     // PendingIntent.FLAG_UPDATE_CURRENT); 

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentTitle("My Car Wash App") 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentText(messageBody) 
      .setDefaults(NotificationCompat.DEFAULT_ALL) 
      .setStyle(new NotificationCompat.BigTextStyle().bigText(messageBody)) 
      .setPriority(NotificationCompat.PRIORITY_MAX); 

    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    notificationManager.notify(0, notificationBuilder.build()); 
    } 

何か助けや提案をいただければ幸いです。

EDIT *******

問題は、私は私のアプリが開いているとき、私は今だけ呼び出されている上記のコードを実現悪いより多くの研究の後に質問をしています。

@Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     //Displaying data in log 
     //It is optional 
     Log.i("myStuff", "From: " + remoteMessage.getFrom()); 
     Log.i("myStuff", "Notification Message Body: " +       remoteMessage.getNotification().getBody()); 
     //Calling method to generate notification 
     sendNotification(remoteMessage.getNotification().getBody()); 
} 

アプリはアプリが実行されない限り、通知は複数行に表示されない理由はフォアグラウンドではない場合onMessageReceivedが呼び出されません。この件に関しては多くの情報が掲載されていますが、まだそれを理解できないようです。

はここでアプリが動作しているときの通知は、Android上でiOSの完璧な、完璧な仕事 *

var data = new 
        { 
         to = deviceId, 
         notification = new 
         { 
          body = msg, 
          title = "My Car Wash", 
          icon = "myicon"     
         }, 
         priority = 10 
        }; 

私のC#サーバー側のコードです。私はちょうどマルチラインで正しく表示するメッセージを得ることができず、私は何をすべきか分からない。

*

+0

BigTextStyle()を通知するように設定しているので、マルチテキストで表示されます。複数の行にテキストが表示されない場合は、2本の指で通知を展開できます。また、通知にアクションを設定していないので、クリックしても表示されなくなります。 – Apurva

+0

私は自分の質問を編集しました。私は提案に感謝しますが、問題は、私のアプリがフォアグラウンドにない限りBigTextStyle()が呼び出されないというコードです。 –

+0

あなたの質問から、あなたは通知ペイロードを使用しているようです。通知ペイロードの代わりにデータペイロードを使用する必要があります。その理由は、通知ペイロードを使用しているときにバックグラウンドで一度追加機能を無視すると、FCMの設計は自動的にデフォルトの通知方法を使用するためです。奇妙だけど、彼らはそうしようと思った。データペイロード機能を使用して試し、結果を確認してください。データのペイロードを送信する方法については、https://firebase.google.com/docs/cloud-messaging/concept-optionsこのリンクを確認してください – JamesYTL

答えて

0

FCMは、私の通知、それはアプリが閉じているときに望んでいる方法を表示します。それは私と大丈夫です。私はちょうど通知全体が読み込まれ、失われていないことを確認したい。ここに私の解決策があります... アプリのユーザーが通知をクリックすると、アプリが開き、アラートダイアログに通知が表示されます。メッセージは、私はそれをつかむと、その後、存在する場合

C#サーバー側のコードは、

var msg2send = new 
      { 
       to = deviceId, 
       priority = 10, 
       notification = new 
       { 
        body = msg, 
        title = "Red Hill Car Wash", 
        icon = "myicon" 
       }, 
       data = new 
       { 
        notice = msg 
       } 
      }; 

そしてMainActivity

String notice = ""; 
try { 
     notice = getIntent().getStringExtra("notice"); 
     if (notice != null) 
     { 
      Log.i("myStuff", notice); 
      ///// DISPLAY NOTIFICATION IN AN ALERT DIAGLOG all good! 
     } 
    } 
    catch (Exception ex) { 
     Log.i("myStuff", ex.getMessage()); 
    } 

FCMののonCreateで

が私のMainActivityにメッセージを渡すメッセージを送信します私はいつまでもそれを表示することができます。この問題を解決するためのコメントとご意見をありがとうございます。

1

onClickが行われたときに何らかのアクションを追加していないので、あなたがそれをクリックしたときに通知が消えつつあります。

通知時にonClick機能を追加するには、対象のアクティビティにPendingIntentを使用する必要があります。必要に応じて追加データを追加することもできます。 notificationManagerを初期化する前に

、このコードを追加します。

Intent openIntent = new Intent(mContext, TargetActivity.class); 
// Falg to clear the stack. 
openIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, 
     openIntent, 0); 
notificationBuilder.setContentIntent(pendingIntent); 
1

1つの方法は、notificationの代わりにdataを使用して、アプリケーションのフォアグラウンドまたはバックグラウンドの両方でonMessageReceived()コールバックを取得することです。JSONの一部は次のとおりです。詳細については

{ 
    "data": { 
     "title": "notification_title", 
     "body": "notification_body" 
    }, 
    "to" : "jh578_gsh....jhHGFJ76FH" 
} 

、このリンクをたどる:https://stackoverflow.com/a/37845174/5829624

編集:

方法2:

あなたの通知ペイロードでclick_actionペイロードを使用してください。 JSONで:

{ 
    "notification": { 
     "click_action": "OPEN_ACTIVITY_1", 
    }, 
} 

そして、あなたのマニフェストに(あなたは、通知をタップ時にロードしたい)活動にこのインテントフィルタを追加します。

<intent-filter> 
    <action android:name="OPEN_ACTIVITY_1" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

は、この1つはあなたの問題を解決することを願っています。

+0

これはアンドロイドには最適ですが、私がpriority = 10、notification = newを使用しないと、IOSデバイスはプッシュ通知を取得しません。 AndroidとiOSアプリのユーザーは、アプリがフォアグラウンドとバックグラウンドのときに通知を受け取ることが重要です。 –

+0

編集した回答を確認してください。 –

1

一般的なシナリオで、 "OnMessageReceived"オーバーライドされたメソッドがアプリケーションで呼び出されない場合。

「OnMessageReceived」メソッドを常に呼び出すようにする場合は、 Webサービスチームに "DATA"ペイロードのみを送信するよう依頼してください。 「通知」または「通知」ペイロードを使用しないでください。

"DATA"ペイロードがバックエンドから適切に送信される場合、Androidアプリケーションは "OnMessageReceived"のデータリストで動作します。RemoteMessage.getDATA();

私はほぼ2日間同じ問題に苦しんで、最終的に上記の解決策を得ました。