有时没有收到推送通知firebase

时间:2017-12-30 09:46:02

标签: java android firebase notifications android-volley

我有时候没有收到通知的问题。为了接收通知,我需要重新启动我的应用程序,然后执行notification.php并显示通知。但是在我再次尝试运行notification.php 30分钟/ 15分钟后,未收到任何通知(我需要再次运行我的应用程序)。我希望你们能帮我解决这个问题。提前谢谢你。

notification.php

<?php

require "../../init.php";
include("../../function_lib.php");

$id  = $_GET['id'];

$title = "Try App";
$message = "news..";
$path_to_fcm = "https://fcm.googleapis.com/fcm/send"; //send push notification through this firebase url
$server_key = "####";

$topic = "/topics/reminder";
$type = "reminder";



//create http request to firease server
//request need 2 section : 1.header section 2. payload section
//add push notification in payload section

//header section for http request : that content authorization key and content_type of this application

//below are the header section of the http request
$headers = array(
            'Authorization:key='.$server_key,
            'Content-Type:application/json'
        );



/*

$field = array('to'=>$topic,'notification'=>array("title"=>"add title","text"=>"add text","click_action"=>"OPEN_ACTIVITY_1"),
                'data'=>array('title'=>$title,'body'=>$message,'type'=>$type,'id'=>$id),'priority'=>"high");
*/
//echo "\n".$key;
// to = refer to fcm token, notification refer to message that wull be use in push notification.
///below are the payload section.
$field = array('to'=>$topic,
                'data'=>array('title'=>$title,'body'=>$message,'type'=>$type,'id'=>$id));

//perform json encode
$payload = json_encode($field);


//pass $payload (content json encode) variable to firebase server

//below  gonna start url section.gonna use firebase url http to send json to firebase server.
$curl_session = curl_init();
curl_setopt($curl_session,CURLOPT_URL, $path_to_fcm);
curl_setopt($curl_session,CURLOPT_POST,true);
curl_setopt($curl_session,CURLOPT_HTTPHEADER,$headers);
curl_setopt($curl_session,CURLOPT_RETURNTRANSFER,true); 
curl_setopt($curl_session,CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_session,CURLOPT_IPRESOLVE,CURL_IPRESOLVE_V4);
curl_setopt($curl_session,CURLOPT_POSTFIELDS, $payload);

//execute curl
$result = curl_exec($curl_session);

//close curl
curl_close($curl_session);

//close  mysqli
//mysql_close($conn);


$path = "../dashboard.php?act=home";
echo ('<script>location.href="'.$path.'"</script>');

?>

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mas.khoi.infoevent">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon_logo_only"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">


        <service android:name=".firebase.FcmInstanceIdService">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
        </service>
        <service android:name=".firebase.FcmMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <activity android:name=".ScreenActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".fragment.MainActivity">

        </activity>
        <activity android:name=".EventDetailsActivity">
        </activity>

    </application>

</manifest>

FcmInstanceIdService.java

public class FcmInstanceIdService extends FirebaseInstanceIdService {

    @Override
    public void onTokenRefresh() {

        //http://stackoverflow.com/questions/38340526/firebase-fcm-token-when-to-send-to-server
        String recent_token = FirebaseInstanceId.getInstance().getToken();

        //add token to sharepreference
        SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(Config.SETTING, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Log.i("generate token",recent_token);
        editor.putString(Config.SETTING_FCM_TOKEN,recent_token);
        editor.commit();
    }
}

FcmMessagingService.java

public class FcmMessagingService extends FirebaseMessagingService {


    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //if want to use function below need to used change data to notification at $field at server side.
        //String message = remoteMessage.getNotification().getBody();
        //String title = remoteMessage.getNotification().getTitle();

        if(remoteMessage.getData().size()>0){
            Log.i("Notification Sucess",""+remoteMessage.getData());
            startNotification(remoteMessage);
        }else{
            Log.i("Notification Failed",""+remoteMessage.getData());
        }

    }


    public void startNotification(RemoteMessage remoteMessage){
        String title = remoteMessage.getData().get("title");
        String messsge = remoteMessage.getData().get("body");
        String type = remoteMessage.getData().get("type");
        String id = remoteMessage.getData().get("id");


        Log.i("Notification","active");
        //Log.i("Notificaition","type:"+type);
        //Log.i("Notificaition","id:"+id);

        //check if notification eihter is reminder or new quote/event
        if (!type.equals("reminder") && id.equals("none")) {

            Intent intent = new Intent(this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
            notificationBuilder.setContentTitle(title);
            notificationBuilder.setContentText(messsge);
            notificationBuilder.setSmallIcon(R.drawable.icon_no_bg);
            notificationBuilder.setAutoCancel(true);
            notificationBuilder.setContentIntent(pendingIntent);

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(0, notificationBuilder.build());
            //super.onMessageReceived(remoteMessage);
        }else

        if(type.equals("reminder") && ! id.equals("none")) {

            Intent intent = new Intent(this, EventDetailsActivity.class);
            intent.putExtra("id",id);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);
            notificationBuilder.setContentTitle(title);
            notificationBuilder.setContentText(messsge);
            notificationBuilder.setSmallIcon(R.drawable.icon_logo_only);
            notificationBuilder.setAutoCancel(true);
            notificationBuilder.setContentIntent(pendingIntent);

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

    }
}

1 个答案:

答案 0 :(得分:1)

请检查this reference何时触发onMessageReceived()方法。

仅当应用程序位于通知消息的前台时才会触发

onMessageReceived(),但对于数据消息,它将始终被处理。