我们正在使用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个屏幕截图,可帮助您理解:
所以你可以看到,在我的注册中,我在DeviceToken中获得的内容以及我在RegistrationId中获得的内容是相同的......我不知道该怎么做:/
答案 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();
}
}
});
}