如何使用 Xamarin 在 iOS 13 中获取设备令牌?

Posted

技术标签:

【中文标题】如何使用 Xamarin 在 iOS 13 中获取设备令牌?【英文标题】:How to get device token in iOS 13 with Xamarin? 【发布时间】:2020-01-21 10:51:02 【问题描述】:

我们的 RegisteredForRemoteNotifications 代码中断,因为令牌是通过以下方式检索的:

deviceToken.ToString().Trim('<').Trim('>').Replace(" ", "");

这曾经可以工作,但不适用于 ios 13,因为数据将是这样的:

"length = 32, bytes = 0x965b251c 6cb1926d e3cb366f dfb16ddd ... 5f857679 376eab7c "

有关于如何使用 Objective c 和 swift 正确执行此操作的答案,但我还没有找到使用 C# 的答案。

参考:

Get device token for push notification

https://nshipster.com/apns-device-tokens/

如何用 Xamarin 做到这一点?

【问题讨论】:

【参考方案1】:

看来我自己找到了答案:

byte[] result = new byte[deviceToken.Length];
Marshal.Copy(deviceToken.Bytes, result, 0, (int) deviceToken.Length);
var token = BitConverter.ToString(result).Replace("-", "");

使用此代码,我能够获取设备令牌并发送通知。

【讨论】:

【参考方案2】:

这是另一种方法:

var bytes = deviceToken.ToArray<byte>();
var hexStringArray = bytes.Select(b => b.ToString("x2")).ToArray();    
var token = string.Join(string.Empty, hexStringArray);

上面的代码基于我在自己的帖子https://medium.com/@kevinle/correctly-capture-ios-13-device-token-in-xamarin-3d0fa390b71b中描述的 NSHipster 的帖子

【讨论】:

【参考方案3】:

您可以使用更简化的版本:

var bytes = deviceToken.ToArray();
var token = BitConverter.ToString(bytes).Replace("-", "");

【讨论】:

【参考方案4】:

将 NSData 转换为字符串

 var tokenStringBase64 =deviceToken.GetBase64EncodedString(NSDataBase64EncodingOptions.None);

将字符串转换为 NSData

var deviceToken = new NSData(tokenStringBase64, NSDataBase64DecodingOptions.None);

【讨论】:

这并没有给我们设备令牌字符串,它似乎对内容进行了编码【参考方案5】:

deviceToken 对象中有一个名为 DebugDescription 的字段。格式化该字段,您将获得令牌。

var myToken = deviceToken.DebugDescription.Replace("<", string.Empty).Replace(">", string.Empty).Replace(" ", string.Empty).ToUpper();

【讨论】:

【参考方案6】:

我遇到了同样的问题,并试图根据这篇文章来实施: https://onesignal.com/blog/ios-13-introduces-4-breaking-changes-to-notifications/

我将在第一时间测试您的解决方案,但您是否测试过它是否与以前的 iOS 版本保持兼容性?

【讨论】:

查看我对答案的评论。不过,您不应该在有问题时发布答案。【参考方案7】:

这在 iOS 13 上对我有用。我认为 linq 选项的性能更好。必须测试 iOS 12 以查看它是否向后兼容。也适用于 iOS 12。这解决了我的问题!感谢您与代码新手分享..

【讨论】:

以上是关于如何使用 Xamarin 在 iOS 13 中获取设备令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Xamarin iOS PickView 获取价值?

如何在 Xamarin.Forms 中获取/检测屏幕大小?

Xamarin.iOS SKProductRequest 事件未在 Debug 中调用(在 iOS 15 和 xCode 13 之前工作)

如何以 xamarin 形式获取 android 和 IOS 设备令牌?

Xamarin.iOS如何在注册到后端以获取推送通知后获取安装ID

Xamarin iOS 如何获取所有可用的 SysSound 列表?