我想创建一个Google Cloud Messaging应用,但问题是我想为每个用户而不是每个应用创建注册令牌(以便相同设备上的不同用户接收特定消息而不是应用范围)。我有谷歌云消息传递工作,但我似乎无法弄清楚如何生成注册ID,以便我可以向特定用户发送消息
InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId ),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
如果我是正确的,它会在这里生成,但我将如何将用户ID放在这里(或在哪里)。或者我完全误解了这一点。
答案 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中使用的主题层次结构。
我已更新上面的示例代码以避免此错误。