请任何人就我对Android应用程序的逻辑怀疑向我提出建议。
我的申请不需要注册使用。但我需要向所有用户发送推送(例如GCM)。所以我创建了一个数据库表如下
user_id | gcm_regid
-------------+-----------------------------------------------
1 | ( reg id get from google at register() )
-------------+-----------------------------------------------
2 | ( reg id get from google at register() )
-------------+-----------------------------------------------
所以逻辑如下
现在问题是
案例1 :当用户在手机中“清除数据”并重新启动应用时,将会发生其他注册过程。因此,当我们发送推送通知时,用户将获得多次(自我们的数据库中存在的最后一个gcmregid)
由于它是一个简单的新闻应用程序,无需用户注册。所以有人请给我一个解决方案吗?
提前致谢
答案 0 :(得分:0)
您是否为特定设备创建了相同的注册ID(在客户端)?
如果是,请遵循
在服务器端首先检查数据库中是否存在注册ID,然后更新其信息,例如 updateTime ,否则注册为新ID。在这种情况下,您的服务器将按设备发送每条消息。
否则
如果注册ID在每个注册过程中有所不同,那么 gcm 将自行处理,即。一段时间后它不会向旧的注册ID发送消息。(在这种情况下,设备只会获得一条消息,因为它只有一个唯一的注册ID)
修改强>
在使用 GCM重新注册设备时,大多数情况下它会创建相同的注册ID,因此您检查服务器端的ID重复,如上所述。
有时Google会更改注册ID,并且您有多个ID与一个设备相关联(仍然google / GCM只向设备发送一个通知,因为GCM服务器会向该设备的新ID发送消息),在这种情况下检查规范ID。有关详细信息,请参阅Canonical IDs
答案 1 :(得分:0)
通过将数据存储在设备的外部存储器中,可以非常可靠地解决用户清除应用程序数据(或卸载和安装应用程序)的问题。如果共享首选项中没有数据,请尝试在存储在外部存储器中的文件中找到它。卸载应用程序时,不会删除此类文件。它仍然可以由用户手动删除,但是你无能为力。
大多数情况下,在同一设备上多次注册到GCM将返回相同的注册ID,因此您的服务器不会为同一设备提供多个注册ID(假设它之前检查是否存在注册ID更新数据库)。
如果同一设备的注册ID发生更改,您可以通过为每个设备创建唯一的实例标识符来检测它,并将该标识符与注册ID一起存储在数据库中。将实例标识符+注册ID发送到服务器时,首先检查数据库中是否存在该实例标识符。如果存在,则用新的注册ID替换旧的注册ID(与该实例标识符相关联)。您应该将实例标识符存储在设备的外部存储器中。
答案 2 :(得分:0)
这里的代码可以解决你的问题......
在启动画面中运行此代码.....
class GCMRegisterAsync extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
GCMRegistrar.checkDevice(yourclass.this);
GCMRegistrar.checkManifest(yourclass.this);
final String regId = GCMRegistrar
.getRegistrationId(yourclass.this);
if (regId.equals("")) {
GCMRegistrar.register(yourclass.this, "xxxxxxxxxxxx");
} else {
Log.d("test", "Already registered");
}
GCMRegistrar.checkDevice(yourclass.this);
Log.d("info",
"unregistereddd....."
+ GCMRegistrar.getRegistrationId(yourclass.this));
GCMRegistrar.checkManifest(yourclass.this);
if (GCMRegistrar.isRegistered(yourclass.this)) {
Log.e("info gcm id is ",
GCMRegistrar.getRegistrationId(yourclass.this));
}
secondclass.regId = GCMRegistrar
.getRegistrationId(yourclass.this);
if (RegisterHalf.regId.equals("")) {
// replace this with the project ID
GCMRegistrar.register(yourclass.this, "xxxxxxxxxxxx");
Log.e("reg id is ",
GCMRegistrar.getRegistrationId(yourclass.this)
);
} else {
Log.e("info", "already registered as" + RegisterHalf.regId);
}
return null;
}
}
在此粘贴代码后,您将id保存到数据库..
SharedPreferences pref = getSharedPreferences(
com.omega.expert.classes.SharedPrefConstants.pref_name, MODE_PRIVATE);
GCMRegistrar.checkDevice(yourclass.this);
GCMRegistrar.checkManifest(yourclass.this);
regId = GCMRegistrar.getRegistrationId(yourclass.this);
Log.e("test", "Reg id:" + regId);
pref.edit().putString(com.omega.expert.classes.SharedPrefConstants.key_gcmid, regId)
.commit();
regId 是您的设备ID ... 保存到数据库....
我已成功实施。这个 您的多设备ID问题将得到解决......