我们正在实施适用于iOS和iOS的推送通知系统。 Android使用Azure通知中心。
应用程序每次启动时都会注册。通过appname_userid标识的标记注册设备以进行推送通知。对于例如Android_1122其中1122是唯一的用户ID。 iPhone设备中的iPhone_1122也是如此。 用户可以拥有多个设备,其中推送消息将被传递给具有相同标签的所有设备。
但是,我们正面临着为少数用户提供重复推送通知的问题。 每次用户卸载&重新安装应用程序,返回一个新令牌。因此,对于该给定标记,会进行多次注册,从而导致重复推送到同一设备。
也经历了类似下面的链接。但是,并不完全清楚使用创建注册ID REST API的确切含义,该API返回registrationId而不实际创建注册。 azure notification hubs - app uninstall
请提供一些方法以避免重复注册同一设备。
以下是我们用来注册的代码。
iOS设备
NSString *mobileServicesURL = @"Endpoint=sb://mobilepushnotificationhub.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=XXXXXXXXXXXXXXXXX=";
SBNotificationHub *hub = [[SBNotificationHub alloc] initWithConnectionString:mobileServicesURL notificationHubPath:@"notificationhubname"];
[hub registerNativeWithDeviceToken:token tags:[NSSet setWithObjects:[NSString stringWithFormat:@"iphoneapp_%@", [self getUserID]], nil] completion:^(NSError* error) {
completion(error);
}];
Android设备
private void gcmPush() {
NotificationsManager.handleNotifications(this, SENDER_ID, MyHandler.class);
gcm = GoogleCloudMessaging.getInstance(this);
String connectionString = "Endpoint=sb://mobilepushnotificationhub.servicebus.windows.net/;SharedAccessKeyName=DefaultListenSharedAccessSignature;SharedAccessKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXX=";
hub = new NotificationHub("notificationhubname", connectionString, this);
registerWithNotificationHubs();
// completed Code
}
// Added Method
@SuppressWarnings("unchecked")
private void registerWithNotificationHubs() {
new AsyncTask() {
@Override
protected Object doInBackground(Object... params) {
try {
String regid = gcm.register(SENDER_ID);
Log.e("regid RECEIVED ", regid);
hub.register(regid, "androidapp_" + WhatsOnIndiaConstant.USERId);
WhatsOnIndiaConstant.notificationHub = hub;
WhatsOnIndiaConstant.gcmHub = gcm;
} catch (Exception ee) {
Log.e("Exception ", ee.getMessage().toString());
return ee;
}
return null;
}
}.execute(null, null, null);
}
答案 0 :(得分:3)
每次用户卸载&重新安装应用程序,一个新的令牌是 回。因此,对于该给定标记,进行多次注册 导致重复推送传递到同一设备。
据我所知,Apple Push Notification Service
一次只有一个工作设备令牌(另请参阅here),因此您不会遇到多个有效设备令牌的问题对于iOS下的一个设备,但您可以为一个设备令牌进行多次Azure Notification Hub
注册。为避免这种情况,您必须检查是否已经注册了具体的设备令牌,如果是,请重新使用并清理它们:
ASP.NET WebAPI-Backend example:
// POST api/register
// This creates a registration id
public async Task<string> Post(string handle = null)
{
// make sure there are no existing registrations for this push handle (used for iOS and Android)
string newRegistrationId = null;
if (handle != null)
{
var registrations = await hub.GetRegistrationsByChannelAsync(handle, 100);
foreach (RegistrationDescription registration in registrations)
{
if (newRegistrationId == null)
{
newRegistrationId = registration.RegistrationId;
}
else
{
await hub.DeleteRegistrationAsync(registration);
}
}
}
if (newRegistrationId == null) newRegistrationId = await hub.CreateRegistrationIdAsync();
return newRegistrationId;
}
使用Google Cloud Messaging
,您似乎可以拥有多个正在运行的GCM注册ID,因此您必须处理此问题。 GCM有一个名为&#34; Canonical IDs
&#34;:
如果应用中的错误触发多次注册 设备,它可能很难调和状态,你最终可能会 重复的消息。
GCM提供了一个名为&#34;规范注册ID&#34;很容易 从这些情况中恢复。定义了规范注册ID 是您的应用程序请求的最后一次注册的ID。这是 服务器在向设备发送消息时应使用的ID。
如果稍后您尝试使用其他注册发送消息 ID,GCM将照常处理请求,但它将包括 规范注册ID在registration_id字段中 响应。确保替换存储在您的注册ID 具有此规范ID的服务器,因为您最终使用的ID将是 停止工作。