Xcode 11下如何完整查看Push Token并转字符串用于调试传输?
嘿,我来帮你搞定这两个关于推送令牌的问题,都是开发中常踩的小坑!
问题1:将推送令牌转换为可用字符串
推送令牌本质是二进制Data类型,直接用description或者UTF8解码都会出问题,正确的做法是把它转换成十六进制字符串——这是服务器接收推送令牌的标准格式,也方便查看、调试和日志记录。
你可以给Data写个简单的扩展来快速实现:
extension Data { var hexEncodedString: String { return self.map { String(format: "%02x", $0) }.joined() } }
然后在你的代码里直接调用就行:
func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) { let pushTokenString = credentials.token.hexEncodedString print("完整推送令牌:\(pushTokenString)") // 这里就可以把pushTokenString用于日志或者发送给服务器了 }
为啥你原来的方法不行?
method1依赖Data的description,这个输出是供调试用的临时格式,不同Xcode版本可能有变化,还会带括号、省略号,处理起来容易出错;method2用UTF8解码二进制数据,但令牌本身不是合法的UTF8字符串,所以只会出现乱码;method3只输出字节数,完全没法拿到有效内容。
问题2:在Xcode 11中完整查看推送令牌
Xcode 11开始对较长的Data对象,在变量视图和默认description里会用省略号截断内容,所以不能靠原来的方式看完整值。有两个简单的解决办法:
用上面的十六进制字符串方法打印
按照问题1里的代码,直接打印pushTokenString,控制台会输出完整的令牌字符串,你可以直接复制到PHP脚本里测试。在LLDB调试控制台直接查看
如果不想修改代码,在调试断点停住时,打开Xcode底部的调试控制台,输入以下命令:po credentials.token.map { String(format: "%02x", $0) }.joined()回车后就能看到完整的令牌字符串,直接复制即可。
另外,你也可以把转换后的字符串赋值给一个变量(比如let token = credentials.token.hexEncodedString),然后在Xcode的变量视图里查看token——这个字符串是完整的,不会被截断。
内容的提问来源于stack exchange,提问作者Piepants
相关产品推荐
相关产品推荐

