8

我的客户端/服务器上用于推送通知的设备注册管理存在小问题。

问题

我遇到的问题是,当我卸载应用程序并重新安装它时,应用程序返回一个空字符串作为注册 id ( GCMRegistrar.getRegistrationId(this)),我用我的服务器重新注册设备。问题是我得到了一个新的、不同的注册 ID(有时)并且两者都有效!所以我不知道服务器端如何知道它是否适用于同一设备。我还应该注意我没有更改应用程序版本。清单的任何更改都会触发新的注册 ID 发出吗?

在 Android 端,我执行以下操作:

    /**
     * 用 GCM 注册这个 android 设备
     */
    私人无效 registerDeviceWithGCM() {
        GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        字符串 regId = GCMRegistrar.getRegistrationId(this);
        如果(regId.equals(“”)){
            log.debug("向 GCM 注册应用程序");
            GCMRegistrar.register(this, ApplicationData.SENDER_ID);
        } 别的 {
            log.debug("已经注册:" + regId);
            deviceRegistrationService.updateServerRegistrationData(this, regId);
        }
    }

在我的GCMIntentService.java我做以下:

    /**
     * 新设备注册时触发,并与服务器更新注册信息
     *
     * @param 上下文上下文接收自
     * @param regId 设备的注册ID
     */
    @覆盖
    受保护的无效onRegistered(上下文上下文,字符串regId){
        Log.d(TAG, "注册:" + regId);
        Intent intent = new Intent(RegistrationReceiver.REGISTRATION_INTENT);
        intent.putExtra(RegistrationReceiver.REGISTRATION_ID, regId);
        context.sendBroadcast(意图);
    }

在我的RegistrationReceiver.java我有以下内容:

    /**
     * 使用 cirrus 触发设备注册
     *
     * @param 上下文未使用
     * @param intent 用于获取注册 ID
     */
    @覆盖
    公共无效句柄接收(上下文上下文,意图意图){
        log.debug("收到注册意图操作:" + intent.getAction());
        if (intent.getAction().equals(REGISTRATION_INTENT)) {
            字符串 regId = intent.getStringExtra(REGISTRATION_ID);
            log.debug("收到注册意图,注册ID:" + regId);
            deviceRegistrationService.updateServerRegistrationData(loginActivity, regId);
        } else if (intent.getAction().equals(REGISTRATION_FAILED_INTENT)) {
            log.debug("收到注册失败意图,显示错误信息");
            showRegistrationFailedMessage(意图);
        }
    }

同样,这里的问题是我有两个或更多的注册 id 都可以工作(如果我在尝试从服务器发布消息时旧的注册 ID 根本不起作用,因为我可以简单地清理它,这不会是一个问题向上)。

4

1 回答 1

11

有时 Google 会更改注册 ID,您会关联多个 ID。发送通知的服务器(您的服务器)必须使用新 ID 更新数据库。

有关更多信息,请查看此文档:

http://developer.android.com/google/gcm/adv.html

说的是:

在服务器端,只要应用程序运行良好,一切都应该正常工作。但是,如果应用程序中的错误触发同一设备的多个注册,则可能很难协调状态,并且您最终可能会收到重复的消息。

GCM 提供了一种称为“规范注册 ID”的工具,可以轻松地从这些情况中恢复。规范注册 ID 定义为您的应用程序请求的最后一次注册的 ID。这是服务器在向设备发送消息时应使用的 ID。

如果稍后您尝试使用不同的注册 ID 发送消息,GCM 将照常处理请求,但它将在响应的 registration_id 字段中包含规范注册 ID。确保使用此规范 ID 替换存储在您服务器中的注册 ID,因为最终您使用的 ID 将停止工作。

于 2013-04-09T18:23:03.057 回答