使用发布/订阅模型在Ionic 2中推送通知

时间:2016-09-21 12:03:15

标签: push-notification phonegap-plugins cordova-plugins ionic2

我正在使用phonegap-plugin-push插件在Ionic 2聊天应用中执行推送通知。

我已根据documentation实施了它,但它可以正常工作,但只能在同一台设备上运行。即如果您提供device token,它会向手机发送通知。

我的问题是聊天应用,我需要一个 PubSub 模型。这样用户就可以发布到主题,而另一个用户可以订阅该主题,即使它们处于不同的主题上。

documentation,似乎有可能。请参阅android.topicsios.topics

  

android.topics array []可选。如果数组包含一个或多个   字符串每个字符串将用于订阅GcmPubSub主题。

所以我尝试以下方法:

Javascript客户端:

发布

    let push = Push.init({
      android: {
        senderID: "xxxxxxxx",
        topics: ['foo']
      },
      ios: {
        alert: "true",
        badge: false,
        sound: "true",
        topics: ['foo']
      },
      windows: {}
    });

push.on('registration', (data) => {
  // call the Java Server
  let promise: Promise<string> = this.notificationService.push(data.registrationId, 'This is a test message from Ionic Chat');
  promise.then((data) => {

  });
});

Java Server:

try {
    System.out.println("NotificationService: device_token: "+device_token);
    logger.info("NotificationService: device_token: "+device_token);
    // Prepare JSON containing the GCM message content. What to send and where to send.
    JSONObject jGcmData = new JSONObject();
    JSONObject jData = new JSONObject();
    jData.put("title", "This is title");
    jData.put("message", message);
    jGcmData.put("to", device_token);  // <===== is this the problem???? it is the data.registrationId from the client
    // What to send in GCM message.
    jGcmData.put("data", jData);
    // Create connection to send GCM Message request.
    URL url = new URL("https://gcm-http.googleapis.com/gcm/send");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestProperty("Authorization", "key=" + API_KEY);
    conn.setRequestProperty("Content-Type", "application/json");
    conn.setRequestMethod("POST");
    conn.setDoOutput(true);
    // Send GCM message content.
    OutputStream outputStream = conn.getOutputStream();
    outputStream.write(jGcmData.toString().getBytes());
} catch (Exception e) {
    e.printStackTrace();
}

Javascript客户端:

订阅

    let push = Push.init({
      android: {
        senderID: "xxxxxxxx",
        topics: ['foo']
      },
      ios: {
        alert: "true",
        badge: false,
        sound: "true",
        topics: ['foo']
      },
      windows: {}
    });

    push.on('notification', (data) => {

    });

它适用于同一台设备,但如果publishersubscriber位于不同的设备上,则无法正常工作。

我认为问题可能是即使其他用户订阅了我发布的主题,它仍然只发布到data.registrationId(设备令牌)。

请参阅Java Server上的以下行:

jGcmData.put("to", device_token);

问题

是否有人知道如何将其发送给该主题的所有订阅者?

我认为答案是here

"to": "/topics/foo-bar",

但是如何为多个主题设置格式呢? (那只是一个主题foo-bar

1 个答案:

答案 0 :(得分:0)

需要更改要发送到主题的Java服务器而不是设备:

jGcmData.put("to", "/topics/"+topics);

请参阅:https://developers.google.com/cloud-messaging/