Xamarin.iOS推送通知标记.NET API / Azure通知中心

时间:2017-04-04 09:36:37

标签: asp.net web-applications push-notification xamarin.ios xamarin.forms

我们正在使用Xamarin.Forms开发跨平台(Android和iOS)应用程序。到目前为止,我们设法让应用程序正常运行,所以很酷!

我们在应用中包含了一些推送通知,使用Azure通知中心,GCM(适用于Android)和APNS(适用于iOS)。它的工作原理几乎没问题!

实际上,我们遇到了最后一个问题:Android的一切正常,我们也可以使用iOS注册推送通知,但我们无法在注册时添加一些标签。

确实,我们需要能够向一个用户或一组用户发送推送通知,而不是向所有人发送推送通知。为此,我们在web api的方法中这样做:

if (user.DeviceType.Equals("Android"))
{
   registration = new GcmRegistrationDescription(handles.Handle);

}
else
{
   registration = new AppleRegistrationDescription(handles.Handle);
}
registration.Tags = new HashSet<string>();
registration.Tags.Add("usermail:" + user.Email);
registration.Tags.Add("userid:" + user.Id);
registration.Tags.Add("userdevice:" + user.DeviceType);
registration.Tags.Add("usertype:" + tag);
registration.RegistrationId = handles.RegistrationId;
await NotificationHelper.Hub.CreateOrUpdateRegistrationAsync(registration);

对于给定的句柄,我们在Android中以这种方式检索它:

protected override void OnRegistered(Context context, string registrationId)
{
   [...] //the registration id is given in args
}

以这种方式在iOS中:

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
   [...]

   var DeviceToken = deviceToken.Description;

   if (!string.IsNullOrWhiteSpace(DeviceToken))
   {
      DeviceToken = DeviceToken.Trim('<').Trim('>');
   }

   UserInformations.Handles.RegistrationId = DeviceToken.Replace(" ", "").ToUpper();

   [...]
}

在Android中一切正常(我能够添加标签)但是我的iOS出错了。这条线

  

等待   NotificationHelper.Hub.CreateOrUpdateRegistrationAsync(登记);

正在生成一个异常,告诉我我的registrationId已经#34;不再有效&#34;。您可以注意到我在iOS的registrationId中删除了间距,因为如果我不知道,我又收到了另一个错误,告诉我我的registrationID包含非十六进制字符。

我不知道该怎么做才能解决这个问题,我在iOS中检索错误的registrationId,还是为APNS添加不同的标签?

感谢您的帮助!

编辑:我注意到设备令牌必须是大写的。但令人惊讶的是,我得到了同样的错误。以下是2个屏幕截图,可帮助您理解:

enter image description here enter image description here

所以你可以看到,在我的注册中,我在DeviceToken中获得的内容以及我在RegistrationId中获得的内容是相同的......我不知道该怎么做:/

1 个答案:

答案 0 :(得分:1)

实际上有大量的在线文档和帖子帖子告诉您调整从iOS方法获得的设备令牌&#39; RegisteredForRemoteNotifications&#39;。但是,如果你查看官方文档,这不是正确的方法。

以下是我们的“已注册的远程通知”中的摘录&#39;方法,你可以看到我们没有对设备令牌做任何事情,试一试,让我知道这是否解决了你的问题。

            if (oldDeviceToken != null)
            {
                if (oldDeviceToken.ToString() != deviceToken.ToString())
                {
                    try
                    {
                        Hub.UnregisterAllAsync(oldDeviceToken, (error) =>
                        {
                            //check for errors in unregistration process.
                            if (error != null)
                            {
                                TestingLogs.ApplicationLog.AppendFile(DateTime.Now.ToString() + "  :  " + "[PNS EXCEPTION] - Exception has been hit! - Message: " + error + " | Source: " + "Unregistering old device token against the notification hub.");
                                //exit out of the code here because we can't keep our hub clean without being able to remove the device from our registration list.
                                return;
                            }
                            else
                            {
                                ShouldComplete = true;
                            }
                        });
                    }
                    catch (Exception genEx)
                    {
                        TestingLogs.ApplicationLog.AppendFile(DateTime.Now.ToString() + "  :  " + "[PNS EXCEPTION] - Exception has been hit! - Message: " + genEx.Message + " | Source: " + genEx + Environment.NewLine + Environment.NewLine);
                    }
                }
            }
            else
            {
                // Store current device token 
                bool res = await ApplicationSettings.StoreDeviceToken(deviceToken);
            }

            // Check if we need to perform our initial registrations

            if (ShouldComplete)
            {
                NSSet RegisteredTags = await ApplicationSettings.RetrieveUserTags();

                if (RegisteredTags == null)
                {
                    RegisteredTags = new NSSet("AppleDevice");
                }

                //Register the device against the notification hub keeping the details accurate at all times.
                Hub.RegisterNativeAsync(deviceToken, RegisteredTags, (errorCallback) =>
                {
                    if (errorCallback != null)
                    {
                        TestingLogs.ApplicationLog.AppendFile(DateTime.Now.ToString() + "  :  " + "[PNS EXCEPTION] - Exception has been hit! - Message: " + errorCallback + " | Source: " + "Registering device token against the notification hub.");
                    }
                    else
                    {
                        if (deviceToken != null)
                        {
                            NSUserDefaults.StandardUserDefaults.SetString("Completed", "InitialTagRegistration");
                            NSUserDefaults.StandardUserDefaults.Synchronize();
                        }
                    }
                });
            }