React Native iOS端Klaviyo Swift SDK设备令牌设置错误求助
问题分析与解决方案
核心问题
你当前的错误在于把十六进制格式的令牌字符串直接转成UTF8 Data,而非将十六进制字符串解析为对应的字节数据。
原令牌字符串是APN令牌的十六进制表示(如80263c75...),每两个字符对应一个字节。但你用Data(tokenString.utf8)得到的是每个字符的ASCII编码(比如字符8的ASCII是0x38,0是0x30),Klaviyo SDK将这个Data转回十六进制字符串时,会把每个ASCII码转成两位十六进制,最终得到38303236...这种和原始令牌完全不符的结果,自然会被判定为无效APN令牌。
正确的转换方法
需要实现十六进制字符串转Data的逻辑,而非直接用UTF8编码转换。以下是适配你项目的两种实现方式:
方式1:Swift 扩展方法
如果RN桥接层用Swift编写,给String添加扩展:
extension String { func hexToData() -> Data? { let length = self.count / 2 var data = Data(capacity: length) var index = self.startIndex for _ in 0..<length { let nextIndex = self.index(index, offsetBy: 2) let substring = self[index..<nextIndex] if let byte = UInt8(substring, radix: 16) { data.append(byte) } else { return nil } index = nextIndex } return data } }
调用示例:
if let tokenData = tokenString.hexToData() { Klaviyo.shared.setPushToken(tokenData) }
方式2:Objective-C 方法
如果RN桥接层用Objective-C编写,使用如下转换方法:
+ (NSData *)dataFromHexString:(NSString *)hexString { hexString = [hexString stringByReplacingOccurrencesOfString:@" " withString:@""]; NSMutableData *data = [NSMutableData data]; unsigned char whole_byte; char byte_chars[3] = {'\0','\0','\0'}; int i; for (i=0; i < [hexString length]/2; i++) { byte_chars[0] = [hexString characterAtIndex:i*2]; byte_chars[1] = [hexString characterAtIndex:i*2+1]; whole_byte = strtol(byte_chars, NULL, 16); [data appendBytes:&whole_byte length:1]; } return data; }
调用示例:
NSString *tokenString = @"80263c753804d9356a12e47d3e3b64145bba8bf4b1d330cbf7d38dc4f60dc7c811f505086fc8b43b1cabc583724cd11ce98edfdf6cf8db44045ff092d232c35886a058710b3ae73bddda920de153a58a"; NSData *tokenData = [YourUtilsClass dataFromHexString:tokenString]; [Klaviyo.shared setPushToken:tokenData];
验证逻辑
转换后的tokenData传入Klaviyo SDK后,SDK内部执行tokenData.map { String(format: "%02.2hhx", $0) }.joined()时,会把每个字节转回两位十六进制字符,最终得到的字符串和你原始的tokenString完全一致,即可被识别为有效APN令牌。
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

