如何使用 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.iOS SKProductRequest 事件未在 Debug 中调用(在 iOS 15 和 xCode 13 之前工作)
如何以 xamarin 形式获取 android 和 IOS 设备令牌?