如何在使用Xamarin开发iOS 13应用时获取设备令牌?

11

我们的 RegisteredForRemoteNotifications 代码出了问题,因为令牌是通过以下方式检索的:

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

这个曾经运行良好,但在iOS 13上无法正常工作,因为数据会像这样:

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

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

参考:

获取推送通知的设备令牌

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

如何在Xamarin中执行此操作?

7个回答

28

看起来我自己找到了答案:

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

使用这段代码,我成功获取了设备令牌并发送了一条通知。


我怎么获得这个 deviceToken 变量? - YaRmgl

6

4

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

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

1
将NSData转换为字符串。
 var tokenStringBase64 =deviceToken.GetBase64EncodedString(NSDataBase64EncodingOptions.None);

将字符串转换为NSData
var deviceToken = new NSData(tokenStringBase64, NSDataBase64DecodingOptions.None);

这并没有给我们设备令牌字符串,它似乎是对内容进行编码。 - dube

0
设备令牌对象中有一个名为DebugDescription的字段。格式化该字段即可获取令牌。
var myToken = deviceToken.DebugDescription.Replace("<", string.Empty).Replace(">", string.Empty).Replace(" ", string.Empty).ToUpper();

-1

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


-1

1
看到我的评论了吗?虽然有疑问,但你不应该发布答案。 - axlrtr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接