【问题标题】:Ionic 3 send push notification with firebase data vs notification payloadIonic 3 使用 Firebase 数据与通知有效负载发送推送通知
【发布时间】:2017-08-01 14:31:39
【问题描述】:

我正在尝试使用 phonegap-plugin-push with @ionic-native/push plugin 使 Firebase 推送通知在 IONIC 3 上工作

这是我的离子信息

全局包:

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 

我无法理解 create 如何创建通知对象服务器站点以使通知在 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 前台 ->收到通知,我可以转到详细信息页面
  • Android 背景 -> 通知已到达,但未调用 on('notification'),因此我无法浏览详细信息页面
  • iOS 前台 -> 通知到达,我可以进入详细页面
  • iOS 后台 -> 通知到达,我可以进入详细页面

唯一的问题是无法在后台控制 Android。

如果我在 Android 上仅使用 数据负载 一切正常(可以在后台和前台转到详细信息页面),但在 iOS 上根本不会收到通知。

如果我只使用通知负载,通知会到达 Andorid 和 iOS,但没有数据负载,所以我的应用不会转到详细信息页面。

我的问题是: 我应该发送什么样的对象才能让 iOS 和 Android 在前台和后台工作??

【问题讨论】:

    标签: android firebase-cloud-messaging ionic3 phonegap-pushplugin ionic-native


    【解决方案1】:

    我阅读了有关 firebase 和 phonegap-plugin-push 的所有文档。 Here 我找到了关于通知和数据有效负载的所有解释。 我读到的内容很奇怪,所以我决定在那里打开一个new issue。 但是我必须找到解决问题的方法,所以我使用了 firebase 主题条件。我会解释我的方式,我希望它可以帮助别人。我不喜欢我使用的方式(实际上我希望插件会被修复),但它可以工作。

    1. 我将 Platform 导入到 .ts 文件中,其中 App 订阅了主题 news
    2. 我为应用订阅了主题 'ios'(如果平台是 iOS)或 'android'(如果平台是 Android)。
    3. 当我从服务器发送推送通知时,我会创建一个这样的有效负载:

      私有函数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);
      

      }

    这个函数被调用了两次(一次用于设备类型 = 0 的 iO,一次用于设备类型 = 1 的 Android),我使用 topic condition 所以我创建了两个不同的有效载荷。 通过这种方式,我让它在后台和前台状态下都可以在 iOS 和 Android 上运行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2017-05-31
      • 2015-08-19
      • 1970-01-01
      • 2015-07-31
      • 2016-07-19
      • 1970-01-01
      相关资源
      最近更新 更多