自定义Google云消息传递令牌

时间:2016-03-11 09:13:37

标签: android google-cloud-messaging

我想创建一个Google Cloud Messaging应用,但问题是我想为每个用户而不是每个应用创建注册令牌(以便相同设备上的不同用户接收特定消息而不是应用范围)。我有谷歌云消息传递工作,但我似乎无法弄清楚如何生成注册ID,以便我可以向特定用户发送消息

InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId ),
                GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

如果我是正确的,它会在这里生成,但我将如何将用户ID放在这里(或在哪里)。或者我完全误解了这一点。

2 个答案:

答案 0 :(得分:1)

您无法自行创建gcm令牌。它是按应用程序生成的,并在应用程序外生成。

你可以做的是保持安装 - >用户&数据库中的用户安装表,并向属于特定用户的所有已安装实例发送通知。

答案 1 :(得分:1)

您可以使用GCM的topic messaging功能。

您的服务器可以向/topics/{userId}发送GCM消息,您的应用应该订阅正在使用该设备的用户。然后,您的应用会收到GCM消息,其中from字段设置为主题,您的应用可以从该处获取。

您在GCM注册服务中执行以下操作:

InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId ),
            GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

GcmPubSub pubSub = GcmPubSub.getInstance(this);
pubSub.subscribe(token, "/topics/user1", null);
pubSub.subscribe(token, "/topics/user2", null);

请注意,您甚至不需要将GCM令牌发送到后端服务,因为它永远不会向特定设备发送GCM消息,只会发送主题。由于您的应用订阅了相应的主题,因此会收到这些消息。

在您的GCM onMessageReceived中,您只需获取私人消息和userId并将其存储在某处。

public void onMessageReceived(String from, Bundle data) {
    final int topicsLength = "/topics/".length();
    String userId = from.substring(topicsLength);
    String privateMessage = data.getString("privateMessage");
    saveMessageSomewhere(userId, privateMessage);
}

然后,当用户登录您的应用时,他们的消息会等待他们。

请注意,您需要生成唯一的用户ID。您可以通过后端服务获取应用请求,也可以依赖UUID.randomUUID()

<强>更新

请注意,GCM主题必须符合规范:/topics/[a-zA-Z0-9-_.~%]+。我错误地认为路径分隔符是允许的,但是如果你使用类似/topics/users/user1的东西,你会遇到:

  

java.lang.IllegalArgumentException:无效的主题名称:/ topics / users / user1

这是因为users/user1中的路径分隔符。 GCM不允许您在REST API中使用的主题层次结构。

我已更新上面的示例代码以避免此错误。

相关问题