专栏首页韦弦的偶尔分享iOS - DeviceToken 解析

iOS - DeviceToken 解析

一直以来使用的解析方式(iOS13之前)都是如下:

Objective-C:

NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];

Swift:

let dataStr = NSData(data: deviceToken)
let token = dataStr.description
    .replacingOccurrences(of: "<", with: "")
    .replacingOccurrences(of: ">", with: "")
    .replacingOccurrences(of: " ", with: "")
    
//当然下面这种方式性能更好:
let charactersToRemove: Set<Character> = ["<", ">", " "]
let tokenNew = dataStr.description.removeAll(where: charactersToRemove.contains)

或者类似的解析方式,都是替换< >空字符串这种方法.

在stackoverflow中有人说过这样的解析方式并不好,但是一直没有问题,所以大家也就习惯了这样的解析方式了,但是iOS13中这样的解析方式就有问题了 大家可以更新解析方式为下面这样的方式(兼容各个版本):

  • Objective-C: (这个是友盟提供的方法)
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    if (![deviceToken isKindOfClass:[NSData class]]) return;
    const unsigned *tokenBytes = [deviceToken bytes];
    NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                          ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                          ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                          ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];
    NSLog(@"deviceToken:%@",hexToken);
}
  • Objective-C: (另一种方法)
if (![deviceToken isKindOfClass:[NSData class]]) return;
NSMutableString *valueString = [NSMutableString string];
const unsigned *tokenBytes = [deviceToken bytes];
NSInteger count = deviceToken.length;
for (int i = 0; i < count; i++) {
    [valueString appendFormat:@"%02x", tokenBytes[i]&0x000000FF];
}

//这个也可改成for in 循环获取
  • Swift:和上面方法基本一致,使用高级函数一行搞定
let token = deviceToken.map{String(format: "%02.2hhx", $0)}.joined()

let token = deviceToken.map{String(format: "%02x", $0)}.joined()

但是,有大神做过测试,下面这种方式最快

let token = deviceToken.reduce("", {$0 + String(format: "%02x", $1)}) //比上面解析速度快

不过好像。。。差距基本也是看不出来的,因为我们只解析一次

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 是什么使代码 “Swifty”? —— Safe

    尽管编程语言是由其语法正式定义的,但实际上在实践中使用它们的方式还是可以由它们当前的约定来确定的。毕竟,就语法而言,大多数受“ C影响 ” 的语言看起来都非常相...

    韦弦zhy
  • Swift 对称二叉树 - LeetCode

    就像人站在镜子前审视自己那样。镜中的反射与现实中的人具有相同的头部,但反射的右臂对应于人的左臂,反之亦然。

    韦弦zhy
  • SwiftU:在循环中创建视图

    通常在一个循环中创建多个SwiftUI视图。例如,我们可能想要遍历一系列名称,并让每个名称成为文本视图,或者遍历一系列菜单项,并将每个名称显示为图像。

    韦弦zhy
  • Golang中的热重启

    这几天在写组里的一个http框架,于是研究了下,在golang中如何实现服务的热重启,从而实现整个服务的重启可以实现对请求客户端的透明。

    netkiddy
  • 【MYSQL分组查询前1或者前几名排名】

    用户5640963
  • 如何编译Azkaban插件

    前面Fayson介绍了《如何编译安装Azkaban服务》,在安装的时候我们再指定配置文件中有配置Web服务和Executor服务的插件路径,说明Azkaban支...

    Fayson
  • 机器视觉算法(第9期)----OpenCV中最最最重要的类型

    今天我们主要学习一下OpenCV中最重要的数据类型--数组Mat,这个结构可以视为是OpenCV所有C++实现的核心,OpenCV中所有主要函数都或是Mat类...

    智能算法
  • PHP-操作数据库数据

    cwl_java
  • const web = HTTP1.1 =&gt; HTTP2.0

    HTTP/2.0是下一代HTTP协议, 由IETF的 [httpbis] 工作小组进行开发。自1999年http1.1发布后的首个更新, HTTP 2.0在20...

    Jean
  • Why hashcode 31?

    前几天被人问到了hashcode如何实现,说实话,真的是没有自己写过,通常情况下都会通过IDE自动生成,惭愧。今天研究了下hashcode的生成原理,...

    高爽

扫码关注云+社区

领取腾讯云代金券