2016-07-07 3 views
0

Я разрабатываю уведомление Push-Firebase с использованием вызова API сервера в приложении Android.it отлично работает, когда приложение находится на переднем плане, но когда приложение не находится на переднем плане, я не могу получить нажатие уведомление.Android-Firebase Push-уведомление, когда приложение находится в фоновом режиме

Я отправляю данные JSON, в которых заголовок содержит ключ 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

Предоставьте свой код для запроса (если это запрос на завивание или нет), то ваша полезная нагрузка на образец, а также ваша служба прослушивания. –

+2

Скорее всего, вы отправляете уведомление, которое обрабатывается ОС, когда ваше приложение находится в фоновом режиме. См. [Этот ответ] (http://stackoverflow.com/a/37711151/209103). Если это не ваш вопрос, вам придется поделиться [минимальным кодом, который воспроизводит проблему] (http://stackoverflow.com/help/mcve). –

+0

@Shreya Редактируйте свой пост, а не отправляйте свой код в качестве комментария. –

ответ

0

я тоже чувствовал, что это происходило в начале, но потом обнаружил, что мой Android App действительно просыпался. К сожалению, он не просыпался достаточно, чтобы делать то, что я хотел (отправьте сообщение REST на мой сервер). Поэтому я отвечу на ваш вопрос вопросом - почему вы решили, что не получили push-уведомления? Для меня, когда я вошел сообщения в onMessageReceived ....

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

Он доказал App был разбужен каждый раз, когда служба пожарной Облако сообщений отправлено сообщение, независимо от того, App был на переднем или заднем плане.

Другие ошибки, я изначально сделал поделюсь с вами:

мне пришлось внести некоторые изменения в моей стороне сервера, чтобы убедиться, что метод Android App onMessageReceived() всегда называли даже в фоновом режиме. Мои сообщения были JSON, HTTP и Upstream. Мой сервер написан на C#.

  1. В Firebase есть 2 типа сообщений, передаваемых по потоку. (a) Уведомление и (b) Данные. Тип показывает, как приложение ведет себя при получении сообщений, зависит от того, находится ли приложение в фоновом режиме или на переднем плане. Поэтому мне понадобилось (б) полезная нагрузка типа данных для удовлетворения моих требований. Просто добавьте «данные»

  2. Мне тогда пришлось сделать мои сообщения высоким приоритетом, а не нормальным. Я выполнил нагрузку тестов как с нормальной, так и с высокой. Обычный не работал, как только приложение Android перешло в режим «Дозировка». Я нашел эту ссылку полезной. 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")); 
    } 
} 
Смежные вопросы