前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS - DeviceToken 解析

iOS - DeviceToken 解析

作者头像
韦弦zhy
修改2020-02-25 14:30:57
2.3K0
修改2020-02-25 14:30:57
举报
文章被收录于专栏:韦弦的偶尔分享

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

Objective-C:

代码语言:javascript
复制
NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];

Swift:

代码语言:javascript
复制
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: (这个是友盟提供的方法)
代码语言:javascript
复制
- (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: (另一种方法)
代码语言:javascript
复制
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:和上面方法基本一致,使用高级函数一行搞定
代码语言:javascript
复制
let token = deviceToken.map{String(format: "%02.2hhx", $0)}.joined()

代码语言:javascript
复制
let token = deviceToken.map{String(format: "%02x", $0)}.joined()

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一直以来使用的解析方式(iOS13之前)都是如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档