GCM:服务器端的多个应用程序ID

时间:2013-02-22 17:50:43

标签: android

在服务器端,我发现一台设备有多个注册ID,这显然给我带来了很多问题。喜欢多次收到的消息。

如果有有效的注册ID,我怎么能得到旧注册ID的红色,或者确保注册不会发生。

当我编写应用程序时,我按照Android doc上的示例教程进行操作:

checkNotNull(SERVER_URL, "SERVER_URL");
        checkNotNull(SENDER_ID, "SENDER_ID");
        // Make sure the device has the proper dependencies.
        GCMRegistrar.checkDevice(this);
        // Make sure the manifest was properly set - comment out this line
        // while developing the app, then uncomment it when it's ready.
        // NOT required any more GCMRegistrar.checkManifest(this);

        /**
         * this code to register reciver moved to message actvity
         */
        //registerReceiver(mHandleMessageReceiver, new IntentFilter(
        //      DISPLAY_MESSAGE_ACTION));


        /* final String */regId = GCMRegistrar.getRegistrationId(this);

        /**
         * save regId in pref to be used by Location update service
         */
        SavePreferences("regId", regId);

        if (regId.equals("")) {
            // Automatically registers application on startup.
            GCMRegistrar.register(this, SENDER_ID);
        } else {
            // Device is already registered on GCM, check server.
            if (GCMRegistrar.isRegisteredOnServer(this)) {
                ;;
                // Skips registration.
                // -- mDisplay.append(getString(R.string.already_registered) +
                // "\n");
            //  System.out.println(getString(R.string.already_registered)
                //      + "\n");

            } else {
                // Try to register again, but not in the UI thread.
                // It's also necessary to cancel the thread onDestroy(),
                // hence the use of AsyncTask instead of a raw thread.
                final Context context = this;
                mRegisterTask = new AsyncTask<Void, Void, Void>() {

                    @Override
                    protected Void doInBackground(Void... params) {
                        boolean registered = ServerUtilities.register(context,
                                regId);
                        // At this point all attempts to register with the app
                        // server failed, so we need to unregister the device
                        // from GCM - the app will try to register again when
                        // it is restarted. Note that GCM will send an
                        // unregistered callback upon completion, but
                        // GCMIntentService.onUnregistered() will ignore it.
                        if (!registered) {
                            GCMRegistrar.unregister(context);
                        }
                        return null;
                    }

                    @Override
                    protected void onPostExecute(Void result) {
                        mRegisterTask = null;
                    }

                };
                mRegisterTask.execute(null, null, null);
            }
        }

编辑:注意,我可以在设备上接收消息。

1 个答案:

答案 0 :(得分:1)

一段时间内,单个设备只有一个注册ID,多个ID不可能。

当您首次运行您的应用程序时,您将获得注册ID,并且您必须将其注册到GCM注册商。否则将不会将消息发送到您的设备。

在服务器端,您需要安全地保留此注册ID,以便在您想要发送消息时使用它。

您跟踪特定设备的注册ID的问题:当您获得设备的注册ID时,如果您正在使用,请将其保存在您的服务器数据库中,否则保留它。并且每当生成新的注册ID时,删除之前的一,并在您的数据库中添加新条目。