2016-07-07 217 views
0

我正在使用Android應用程序中的服務器API調用開發Firebase推送通知。當應用程序處於前臺但應用程序不在前臺時,它完美工作,但無法獲得推送通知。當應用程序在後臺時的Android-Firebase推送通知

我正在發送JSON數據,其中頭包含Server API密鑰和內容類型,並且該值包含以數組身體爲數據的數據。感謝任何幫助。

PHP代碼:

$url = 'https://fcm.googleapis.com/fcm/send'; 
$fields =array('registration_ids' => $tokens,'data' => $message); 
$headers = array('Authorization:key = value','Content-type:application/json'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch,CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 
curl_setopt ($ch,CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false); 
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 
$result = curl_exec($ch);?> 
+0

爲請求提供代碼(如果它是一個curl請求或不是),那麼你的樣本有效載荷,也是你的監聽器服務。 –

+2

您最有可能發送通知消息,當您的應用在後臺時由操作系統處理。看[這個答案](http://stackoverflow.com/a/37711151/209103)。如果這不是你的問題,你將不得不分享[重現問題的最小代碼](http://stackoverflow.com/help/mcve)。 –

+0

@Shreya請修改您的帖子,而不是將您的代碼發佈爲評論。 –

回答

0

我也覺得這是在年初發生,但隨後發現,我的Android應用程序確實醒來。不幸的是,它沒有足夠的喚醒來做我想做的事情(發送心跳REST消息到我的服務器)。所以我會用一個問題回答你的問題 - 你爲什麼決定你沒有收到推送通知?對我來說,當我登錄的消息從onMessageReceived內....

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Log.d(TAG, "From: " + remoteMessage.getFrom()); 
    Log.d(TAG, "Notification Message Body: " + remoteMessage.getData()); 
} 

它證明了應用得到了每一次的消防雲消息服務發送消息喚醒,如果不管應用程序在前臺或後臺。

其他錯誤,我做了最初我將與大家分享:

我不得不做出一些改變,我的服務器端,以確保即使在背景模式的Android應用程序onMessageReceived()方法總是叫。我的消息是JSON和HTTP以及上游。我的服務器是用C#編寫的。

  1. 在Firebase中有兩種類型的有效負載下游消息。 (a)通知和(b)數據。該類型描述了接收消息時App的行爲方式取決於應用程序是在後臺還是在前臺。因此我需要(b)數據類型有效載荷來滿足我的要求。只需添加「數據」

  2. 然後我不得不使我的消息高優先級,而不是正常。我進行了正常和高負荷的測試。一旦Android應用程序進入打盹模式,Normal正常工作。我發現這個參考很有用。 https://developer.android.com/training/monitoring-device-state/doze-standby.html#support_for_other_use_cases

+0

謝謝你的幫助,但這不適合我,我嘗試了所有的事情 – Shreya

0

看看我的代碼。也許它會幫助你:

$token = getTokenDevice($dn); 

    $path_to_firebase_cm = 'https://fcm.googleapis.com/fcm/send'; 

    $fields = array(
     'to' => $token, 
     'priority' => 'normal', 
     'content_available' => true, 
     'data' => array('type' => $type, 'title' => $title, 'body' => $message) 
); 

    $headers = array(
     'Authorization:key='.$server_key, 
     'Content-Type:application/json' 
); 
    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $path_to_firebase_cm); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 

    $result = curl_exec($ch); 

    curl_close($ch); 

我用content_available爲iOS設備。當應用程序處於後臺時,該代碼適用於Android和iOS。

所以你應該檢查你的FirebaseMessaging服務。我看起來是這樣的:

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Auth auth = new Auth(getApplicationContext()); 

    Map<String, String> data = remoteMessage.getData(); 

    if (auth.isNotificationEnabled(data.get("type"))) { 
     Log.e(TAG, "data: " + remoteMessage.getData()); 
     sendNotification(data.get("title"), data.get("body")); 
    } 
} 
相關問題