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

被折叠的 条评论
为什么被折叠?



