为什么 GCM 推送通知被复制?
Why are GCM Push notifications being duplicated?
我正在设置一个使用 Xamarin 构建的 Android 应用程序,以使用 Google 云消息传递接收推送通知。除了一个例外,一切似乎都按预期工作 - 偶尔会重复通知。也就是说,负责处理来自 GCM 的意图的 BroadcastReceiver 接收到多个而不是一个。
我的第一个假设是该应用有时会注册两次或更多次通知,但后来我确认负责向 GCM 注册的代码只能调用一次,问题仍然存在。在已重新启动的设备上全新安装应用程序时确实如此,因此我认为这也不可能是先前注册处于活动状态的情况。
注册通知:
string appVersion = context.PackageManager.GetPackageInfo(context.PackageName, 0).VersionName;
// AppSettings is a helper class I use to save important settings in shared preferences
if (AppSettings.GCMID == string.Empty || AppSettings.GCMRegisteredAppVersion != appVersion)
{
GoogleCloudMessaging gcm = GoogleCloudMessaging.GetInstance(context);
string gcmProjectNumber = context.GetString(Resource.String.GCMProjectNumber);
string gcmid = gcm.Register(gcmProjectNumber);
AppSettings.GCMID = gcmid;
AppSettings.GCMRegisteredAppVersion = appVersion;
}
// This method lets our server know that this device is ready to receive notifications
RegisterForNotifications(AppSettings.GCMID, AppSettings.GUID, PlatformType.Android);
接收通知:
[BroadcastReceiver,
IntentFilter(new string[]{"com.google.android.c2dm.intent.RECEIVE"},
Categories = new string[]{ "com.example.gcm" }
)]
public class NotificationReceiver : WakefulBroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
var newIntent = new Intent(context, typeof(NotificationService));
newIntent.PutExtras(intent);
context.StartService(newIntent);
ResultCode = Result.Ok;
}
}
更奇怪的是,重复的数量似乎与该应用 运行 的使用时长有关。如果我在加载应用程序后立即发送通知,我会收到两个推送通知,但如果在发送前停留更长时间,可能会出现更多。但是,一旦收到通知,应用程序收到的以下通知只会出现一次,这是它们应该出现的。
我完全不知道是什么原因造成的;我们将不胜感激任何帮助,即使只是对正确方向的点头。
谢谢。
“...如果在发送前放置更长时间,可能会出现更多。一旦收到...应用程序收到的通知只出现一次”-> 这在您的所有测试中是否一致?
请检查两件事:用于发送通知的服务器端代码和 GCM message status 的 Play 开发者控制台。在前者中,您可能会发送两次相同的消息。在后者中,查找您使用的注册令牌并查看是否有来自服务器的重复发送。
我更新到最新版本的 GooglePlayServices.GCM 库,重复的意图不再出现。这可能意味着它是库的一个错误,但不幸的是我从未找到问题的确切来源,所以无法确认任何一种方式。
当您在数据中发送 "notification" 标签时也有可能。只需将其从您的 json 中删除,消息就不会重复。
我正在设置一个使用 Xamarin 构建的 Android 应用程序,以使用 Google 云消息传递接收推送通知。除了一个例外,一切似乎都按预期工作 - 偶尔会重复通知。也就是说,负责处理来自 GCM 的意图的 BroadcastReceiver 接收到多个而不是一个。
我的第一个假设是该应用有时会注册两次或更多次通知,但后来我确认负责向 GCM 注册的代码只能调用一次,问题仍然存在。在已重新启动的设备上全新安装应用程序时确实如此,因此我认为这也不可能是先前注册处于活动状态的情况。
注册通知:
string appVersion = context.PackageManager.GetPackageInfo(context.PackageName, 0).VersionName;
// AppSettings is a helper class I use to save important settings in shared preferences
if (AppSettings.GCMID == string.Empty || AppSettings.GCMRegisteredAppVersion != appVersion)
{
GoogleCloudMessaging gcm = GoogleCloudMessaging.GetInstance(context);
string gcmProjectNumber = context.GetString(Resource.String.GCMProjectNumber);
string gcmid = gcm.Register(gcmProjectNumber);
AppSettings.GCMID = gcmid;
AppSettings.GCMRegisteredAppVersion = appVersion;
}
// This method lets our server know that this device is ready to receive notifications
RegisterForNotifications(AppSettings.GCMID, AppSettings.GUID, PlatformType.Android);
接收通知:
[BroadcastReceiver,
IntentFilter(new string[]{"com.google.android.c2dm.intent.RECEIVE"},
Categories = new string[]{ "com.example.gcm" }
)]
public class NotificationReceiver : WakefulBroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
var newIntent = new Intent(context, typeof(NotificationService));
newIntent.PutExtras(intent);
context.StartService(newIntent);
ResultCode = Result.Ok;
}
}
更奇怪的是,重复的数量似乎与该应用 运行 的使用时长有关。如果我在加载应用程序后立即发送通知,我会收到两个推送通知,但如果在发送前停留更长时间,可能会出现更多。但是,一旦收到通知,应用程序收到的以下通知只会出现一次,这是它们应该出现的。
我完全不知道是什么原因造成的;我们将不胜感激任何帮助,即使只是对正确方向的点头。
谢谢。
“...如果在发送前放置更长时间,可能会出现更多。一旦收到...应用程序收到的通知只出现一次”-> 这在您的所有测试中是否一致?
请检查两件事:用于发送通知的服务器端代码和 GCM message status 的 Play 开发者控制台。在前者中,您可能会发送两次相同的消息。在后者中,查找您使用的注册令牌并查看是否有来自服务器的重复发送。
我更新到最新版本的 GooglePlayServices.GCM 库,重复的意图不再出现。这可能意味着它是库的一个错误,但不幸的是我从未找到问题的确切来源,所以无法确认任何一种方式。
当您在数据中发送 "notification" 标签时也有可能。只需将其从您的 json 中删除,消息就不会重复。