使用Azure推送通知重复推送通知

时间:2015-03-10 15:00:33

标签: azure apple-push-notifications google-cloud-messaging azure-notificationhub

  • 我们正在实施适用于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);
}

1 个答案:

答案 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将是   停止工作。