【问题标题】:How to get device token in iOS 13 with Xamarin?如何使用 Xamarin 在 iOS 13 中获取设备令牌?
【发布时间】: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 做到这一点?

【问题讨论】:

    标签: c# ios xamarin xamarin.forms xamarin.ios


    【解决方案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。这解决了我的问题!感谢您与代码新手分享..

            【讨论】:

              猜你喜欢
              • 2021-01-02
              • 2015-12-02
              • 2020-02-04
              • 1970-01-01
              • 2017-04-13
              • 2020-10-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多