我对GCM-IDs
的正确使用有疑问。
目前我有一个InstanceIDListenerService
一个GcmListenerService
和一个RegestrationIntentService
。
每次有人打开应用时,RegeistrationIntentServie
都会开始MainActivity
。
我认为这是Google指南的正确实施。
但处理GCM-ID
的最佳方法是什么,以便在GCM-IDs
刷新后我的服务器上不会出现InstandeIDListenerService
错误。因为目前刷新只在我的服务器上注册一个新的GCM-ID
。
是否可以生成随机设备ID,以便我可以更新旧的GCM-ID
?
你如何处理身份证?
因为目前我询问服务器每次启动应用程序是否知道GCM-ID
与(随机生成的)设备ID相结合,如果另一个不正确或不更新,则更新其中一个存在。
我认为这会产生大量的网络流量。
答案 0 :(得分:0)
可以肯定的是,你没有自己打电话给 if (lstValue.SelectedItem != null)
{
lstValue.Items.Remove(lstValue.SelectedItem);
txtQlt.Text = txtQlt.Text.Replace(lstValue.SelectedItem.ToString(), "");
}
吗?如有必要,系统将调用此方法。
要回答您的问题,您应该使用名为“规范ID”的GCM功能:
<强>
noneOf
强>如果客户端应用中的错误触发了多个注册 相同的设备,可能很难协调状态和客户端应用程序 可能最终会出现重复的消息。
实施规范ID可以帮助您更轻松地从中恢复 的情况。 规范注册ID是注册令牌 客户端应用程序请求的最后一次注册。这是ID 服务器在向设备发送消息时应使用
如果您尝试使用旧的注册令牌发送消息,GCM将会 像往常一样处理请求,但它将包括规范ID 响应的registration_id字段。 确保更换 使用此规范ID存储在服务器中的注册令牌,如 最终旧的注册令牌将停止工作。
更准确地说,如果同一设备有两个注册,并且您使用较旧的注册ID发送通知,您将获得规范ID(此设备的最新注册的注册ID)。如果此ID已存储在您的服务器上,请删除旧注册。如果规范ID因任何原因未存储在您的服务器上,请将用于发送通知的注册ID替换为规范ID。
答案 1 :(得分:0)
@leet GCM ID令牌会在您的令牌需要刷新时定期启动回调,或在某些时候: - 安全问题;喜欢ssl或平台问题 - 设备信息不再有效;例如备份和恢复。 - 实例ID服务会受到影响。
public class MyInstanceIDService extends InstanceIDListenerService {
public void onTokenRefresh() {
refreshAllTokens();
}
private void refreshAllTokens() {
// assuming you have defined TokenList as
// some generalized store for your tokens
ArrayList<TokenList> tokenList = TokensList.get();
InstanceID iid = InstanceID.getInstance(this);
for(tokenItem : tokenList) {
tokenItem.token =
iid.getToken(tokenItem.authorizedEntity,tokenItem.scope,tokenItem.options);
// send this tokenItem.token to your server
}
}
};
Keeping the Registration State in Sync
保护客户端应用和应用服务器免受潜在恶意攻击 重新使用注册令牌,您应该定期发起令牌 从服务器刷新。当GCM注册令牌刷新时 从服务器端启动,客户端应用程序必须处理 带有GCM注册客户端/服务器的tokenRefreshed消息 握手。这个link可以帮助您验证方式 处理刷新令牌。
正如Baris所提到的,当您向设备发送消息时,您的服务器必须使用规范ID。 tokenRefresh将删除生成随机设备ID的想法,而Canonical ID将解决您如何验证ID是否正确的问题。