iOS 10 NSData 转化为NSString 失败

在适配iOS 10时,作者发现NSData无法成功转化为NSString,NSJSONSerialization解析也返回nil。问题出现在尝试将推送通知的deviceToken转化为字符串时。经排查,原因可能是转换格式错误,因为deviceToken并非JSON类型。最终,作者通过使用[deviceToken description]方法解决了问题,这是一个适用于所有OC对象的转化方法。

遇到的问题

为了适配iOS 10 ,我新建了一个测试项目。结果发现了一个问题。就是NSData 转化为NSString  失败,使用  NSJSONSerialization 解析也失败。结果都是 nil.

下面我就来说说这个问题。这个问题是我在适配 iOS 10 推送通知,获取token 的时候发现的。当时 我获取了 token,但是转化成NSString 结果输出为 nil. 本来以为是token 没有获取到,但是直接输出 deviceToken 是有值得。就是转化为NSString 出现了问题。

NSString *token = [[NSString alloc]initWithData:deviceToken encoding:NSUTF8StringEncoding];
    token =  [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    token =  [token stringByReplacingOccurrencesOfString:@"<" withString:@""];
    token =  [token stringByReplacingOccurrencesOfString:@">" withString:@""];

    NSLog(@"request notificatoin token success. %@",token);

2016-09-20 15:25:09.837367 demo[3483:1451249] request notificatoin token success. (null)

我有试了系统的json 解析,结果也失败了。

 NSError *error;
    NSString *tokenMessage = [NSJSONSerialization JSONObjectWithData:deviceToken options:kNilOptions error:&error];
    if (error) {
        NSLog(@"解析失败。 error= %@",error.localizedDescription);
    }
    
    NSLog(@"解析的token = %@",tokenMessage);

 解析失败。 error= The data couldn’t be read because it isn’t in the correct format.
2016-09-20 15:29:01.322631 demo[3486:1452379] 解析的token = (null)

错误原因是解析的格式错误。不知道这个只能成功的解析 方法,不知道为什么失效了。


PS: 有人告诉我deviceToken 不是json类型的文件,当然没办法解析。大家自动忽略上面这一段吧。


解决方法

目前的解决方法是暂时不使用系统的解析方法。

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

    NSLog(@"request notificatoin token success. %@",token);

2016-09-20 15:33:04.092966 demo[3489:1453498] request notificatoin token success. d6d1f2fa8f0f433663947173e08553dc4c7cdca073290672xxxxxxxxxxxxxxxx

使用 [deviceToken description]  这个方法,这个方法是Java的tostring 。所有的OC对象都可以使用这个方法。只要data不是用64之类的转码来的,都可以用这个转成字符串。这个方法并不是iOS 10 才出现的。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值