Ionic 3 отправляет push-уведомление с данными firebase и полезной нагрузкой уведомления

Я пытаюсь заставить push-уведомление firebase работать на IONIC 3, используя phonegap-plugin-push с @ ionic-native / плагин push

Это моя ионная информация

глобальные пакеты:

Cordova CLI : 7.0.1 

локальные пакеты:

@ionic/app-scripts : 2.1.3
Cordova Platforms  : android 6.2.3 ios 4.4.0
Ionic Framework    : ionic-angular 3.6.0

Система:

Android SDK Tools : 25.2.2
Node              : v8.1.3
OS                : macOS Sierra
Xcode             : Xcode 8.3.3 Build version 8E3004b 
ios-deploy        : 1.9.1 
ios-sim           : 6.0.0 
npm               : 5.1.0 

Я не могу понять, как создать объект-сервер-сайт уведомлений, чтобы уведомление работало как на iOS, так и на Android. Я прочитал все о различиях между уведомлением и полезной нагрузкой данных, тогда я не могу понять, каким должен быть объект, чтобы он работал на всех платформах и во всех состояниях приложения (фон и передний план).

Это мой исходный объект

  $p = array(
        'id'             => $post['id'],
        'title'             => $post['title'],
        'description'       => $post['description'],
        'text'              => $post['text'],
        'image_url'         => $post['image_url']
    );
    $msg = array(
        'title'     => "test",
        'body'      => $post['title'],
        'post'      => $p,
        'vibrate'   => 1,
        'sound'     => "default"
    );

    $fields = array();
    $fields['to']           =  "/topics/news";
    $fields['data']         = $msg;
    $fields["notification"] =  array('title' => 'test', 'body' => $post['title'],  'sound' => 1);

Итак, я попытался собрать вместе данные и полезную нагрузку уведомлений. Результат

  • Android Foreground → уведомление прибыло, и я могу перейти на страницу с подробностями
  • Фон Android → уведомление прибыло, но ('уведомление') не вызывается, поэтому я не могу перемещаться по странице сведений
  • iOS Foreground -> пришло уведомление, и я могу перейти на страницу с подробностями
  • Фон iOS -> пришло уведомление, и я могу перейти на страницу с подробностями

Единственная проблема - невозможно управлять Android в фоновом режиме.

Если я использую только полезную нагрузку данных на Android, все работает (можно перейти на страницу с подробностями в фоновом или переднем плане), но на iOS уведомления не приходят вообще.

Если я использую только полезную нагрузку уведомления, уведомление приходит на Andorid и iOS, но без полезной нагрузки данных, поэтому мое приложение не переходит на страницу сведений.

Мой вопрос: какой объект я должен отправить, чтобы iOS и Android работали на переднем и заднем плане?


person Ruben Rocco De Luca    schedule 01.08.2017    source источник


Ответы (1)


Я прочитал всю документацию о firebase и phonegap-plugin-push. Здесь I нашел все объяснения об уведомлении и полезной нагрузке данных. Я прочитал очень странно, поэтому решил открыть новый выпуск там. Но мне нужно было найти выход, чтобы решить мою проблему, поэтому я использовал условие темы firebase. Я объясню свой путь и надеюсь, что это может кому-то помочь. Мне не нравится то, как я использовал (на самом деле, я надеюсь, что плагин будет исправлен), но он работает.

  1. Я импортирую платформу в файл .ts, где приложение подписано на тему новости.
  2. Я подписал приложение на тему 'ios', если платформа - iOS, или 'android', если платформа - Android.
  3. Когда я отправляю push-уведомление с сервера, я создаю такую ​​полезную нагрузку:

    частная функция really_send ($ post, $ device_type) // $ device_type == 0 iOS - $ device_type == 1 Android {

    $p = array(
        'id' => $post['id'],
        'title' => $post['title'],
        'description' => $post['description'],
        'text' => $post['text'],
        'image_url' => $post['image_url'],
        'date' => $post['date']
    );
    $msg = array(
        'title' => "Title",
        'body' => $post['title'],
        'post' => $p,
        'vibrate' => 1,
        'sound' => 1
    );
    
    $fields = array();
    $fields["priority"] = "high";
    if ($device_type == 0) {
        $fields['condition'] = "'ios' in topics && 'news' in topics";
        $fields["notification"] = array(
            'title' => 'Title',
            'body' => $post['title'],
            'sound' => 'default',
            'icon' => 'notification_icon'
    
        );
    } else {
        $fields['condition'] = "'android' in topics && 'news' in topics";
    }
    $fields['data'] = $msg;
    
    
    $url = 'https://fcm.googleapis.com/fcm/send';
    
    $headers = array
    (
        'Authorization: key=xxxx',
        '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_VERIFYPEER, true);
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
    $result = curl_exec($ch);
    

    }

Эта функция вызывается дважды (один раз для iOS с deviceType = 0 и один раз для Android с deviceType = 1), и я использую условие темы Итак, я создаю два разных элемента данных. Таким образом я заставил работать как iOS, так и Android в фоновом и переднем режимах.

person Ruben Rocco De Luca    schedule 07.08.2017