Azure通知中心Xamarin为多个模板注册多个

时间:2016-01-14 15:07:38

标签: ios templates azure xamarin azure-notificationhub

我需要一些帮助,使用Azure通知中心为多个模板注册iOS设备。

注册单个模板工作正常,但似乎从单个设备注册多个模板时,注册的第二个模板始终正常工作,并且注册的第一个模板无法正常工作。

我前几天发现了一些事情,说每个模板必须有一个独特的PNS手柄,但即使得到(我认为可能是)2个独特的PNS手柄似乎也不起作用。

模板#1:

{"aps":{"title":"$(emergencyTitle)","alert":"$(emergencyMessage)","tags":"$(emergencyTags)"}}

模板#2:

{"aps":{"content-available":1,"title":"$(regularTitle)","alert":"$(regularMessage)","inAppMessage":"$(regularMessage)","tags":"$(regularTags)"}}

下面的代码被调用两次(我希望得到2个独特的PNS句柄)。每次,它都会将deviceToken保存在变量中,以便我可以使用它们注册2个模板:

if(UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) {
    UIApplication.SharedApplication.RegisterUserNotificationSettings(UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, new Foundation.NSSet()));

    UIApplication.SharedApplication.RegisterForRemoteNotifications();
} else {
    UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound);
}

然后,下面的精简代码会调用通知中心来尝试注册2个模板:

Hub = Hub ?? new WindowsAzure.Messaging.SBNotificationHub(Constants.ConnectionString, Constants.NotificationHubPath);

// App.PushNotificationPnsHandles is a Dictionary<string, object> that holds an 'emergency' or 'regular' key and the deviceTokens
// Constants.EmergencyNotificationTemplate and Constants.RegularNotificationTemplate hold the template strings

Hub.UnregisterAllAsync((NSData)App.PushNotificationPnsHandles["emergency"], error => {
    Hub.RegisterTemplateAsync((NSData)App.PushNotificationPnsHandles["emergency"], "EmergencyTemplate", Constants.EmergencyNotificationTemplate, System.DateTime.Now.AddDays(90).ToString(System.Globalization.CultureInfo.CreateSpecificCulture("en-US")), new NSSet(), errorCallback => { });
});

Hub.UnregisterAllAsync((NSData)App.PushNotificationPnsHandles["regular"], error => {
    Hub.RegisterTemplateAsync((NSData)App.PushNotificationPnsHandles["regular"], "RegularTemplate", Constants.RegularNotificationTemplate, System.DateTime.Now.AddDays(90).ToString(System.Globalization.CultureInfo.CreateSpecificCulture("en-US")), new NSSet(), errorCallback => { });
});

同样,如果我拨打一个电话来注册紧急模板,一切都很有效。如果我拨打一个电话来注册常规模板,一切都会很好。

如果我首先尝试注册紧急模板然后再注册常规模板,那么我会发送紧急推送通知,推送通知确实到达手机,但它不包含任何变量中的文本...确定我在这里做错了什么。感谢。

编辑:查看Visual Studio中的Notification Hub调试窗口,我可以看到2个注册,每个注册具有不同的注册ID但具有相同的PNS标识符。如果是这种情况,那么我不确定如何为每个模板获取唯一标识符。

1 个答案:

答案 0 :(得分:4)

  1. 特定设备上的特定应用由一个特定的PNS句柄标识。您无法在同一设备上为同一个应用设置多个不同的PNS句柄。
  2. 如果您不想删除所有注册,请不要使用UnregisterAllAsync()。只需使用RegisterTemplateAsync(),即可创建或更新模板注册。
  3. 如果您想使用多个模板,则必须区分不同标签的注册,而不是使用不同的PNS句柄,因为PNS句柄始终相同。
  4. 所以,你要做的是:

    1. 不要两次获得PNS句柄,但只能获得一次,因为它始终是相同的。
    2. 移除对UnregisterAllAsync()的来电,RegisterTemplateAsync()已足够。
    3. 将至少一个代码传递给RegisterTemplateAsync()而不是空NSSet,并确保每个模板注册的代码不同,例如&#34;模板:紧急&#34;和&#34;模板:常规&#34;。
    4. 如果您想发送&#34;常规&#34;通知,提供&#34;模板:常规&#34;标记,以解决正确的注册,如果你想发送&#34; emergeny&#34;通知,使用&#34;模板:紧急&#34;标签