加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 09:43:35 所属栏目:asp.Net 来源:网络整理
导读:我们正在使用Xamarin.Forms开发跨平台( Android和iOS)应用程序.到目前为止,我们设法让应用程序正常运行,所以很酷! 我们在我们的应用程序中包含了一些推送通知,使用Azure通知中心,GCM(适用于Android)和APNS(适用于iOS).它工作得很好! 实际上,我们只有最后一
我们正在使用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);

对于给定的Handle,我们在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出错了.这条线

await
NotificationHelper.Hub.CreateOrUpdateRegistrationAsync(registration);

正在生成异常,告诉我我的registrationId“不再有效”.您可以注意到我在iOS的registrationId中删除了间距,因为如果我没有,我会收到另一个错误,告诉我我的registrationID包含非十六进制字符.

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

谢谢你的帮助 !

编辑:我注意到设备令牌必须是大写的.但令人惊讶的是,我得到了同样的错误.这里有2个截图,以帮助您了解:

enter image description here


enter image description here

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

解决方法

实际上有很多在线文档和帖子帖子告诉你调整你从iOS方法’RegisteredForRemoteNotifications’获得的设备令牌.但是,如果你查看官方文档,这不是正确的方法.

以下是我们的“RegisteredForRemoteNotifications”方法的片段,因为您可以看到我们对设备令牌没有任何操作,请试一试,如果这样可以解决您的问题,请告诉我.

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();
                        }
                    }
                });
            }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读