Push Notifications in Ionic 2 with the Pub/Sub Model

妖精的绣舞 提交于 2019-12-02 14:51:11

问题


I am using the phonegap-plugin-push plugin to do Push Notifications in an Ionic 2 Chat App.

I've implemented it according to the documentation, and it works, but only on the same device. i.e. it sends a notification to the phone if you supply its device token.

My issue is for a chat app, I need a PubSub model. So that a user can publish to a topic and another user can subscribe to that topic even if they are on different decices.

Looking at the documentation, it seems to be possible. See android.topics and ios.topics.

android.topics array [] Optional. If the array contains one or more strings each string will be used to subscribe to a GcmPubSub topic.

So I try the following:

Javascript Client:

publish

    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 Client:

Subscribe

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

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

    });

It works on the same device, but it doesn't work if the publisher and subscriber are on different devices.

I think the problem may be that even though another user is subscribed to the topic I publish to, it is still only publishing to the data.registrationId (Device Token).

See the following line on the Java Server:

jGcmData.put("to", device_token);

Question

Does anyone know how to make it send to all subscribers on that topic?

I think the answer is here:

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

But how should this be formatted for multiple topics? (that's just one topic foo-bar)


回答1:


Need to Change the Java Server to send to the topic instead of the device:

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

see: https://developers.google.com/cloud-messaging/



来源:https://stackoverflow.com/questions/39616067/push-notifications-in-ionic-2-with-the-pub-sub-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!