TestFlight 构建产生错误的推送令牌

TestFlight build produces bad push tokens

从 TestFlight 下载构建时生成错误推送令牌的原因可能是什么?

自动代码签名 使用 Apple Development 证书而不是 Apple Distribution 签署 RELEASE 吗?但我在几个项目中一直这样做,没有任何问题。


TestFlight 构建生成的错误推送令牌示例:

7F0000000000000020000061A24474DD290000000000000000000000028359F6

从 Xcode 构建生成的良好推送令牌示例(均具有 DEBUG 和 RELEASE 运行 配置):

83BBE6AFED8323C0A19006C6DE4E6BF481D8A5AE3A1372EFEA84DDF71BA5C6F0

我在这里分享我的解决方案。更多上下文,项目写在Objective-C.

我也尝试过使用手动代码签名将构建上传到 TestFlight。

我将 NSData pushToken 转换为 NSString 的方法是使用我一直在使用的 Swift 函数并将其移植到 Objective-C:

import Foundation

extension NSData {
    @objc func extractPushToken() -> String {
        return self.reduce("", {[=10=] + String(format: "%02X", )})
    }
}

Swift 函数在 Swift 项目的调试和发布模式下都运行良好,它也适用于我当前的 Objective-C 项目的调试模式。好像很奇怪。

但我必须使 TestFlight 构建(发布模式)工作的唯一解决方案是使用 Objective-C 提取 pushToken 的方法:

- (NSString *)tokenFromData:(NSData *)tokenData
{
    const unsigned *tokenBytes = [tokenData bytes];
    NSString *tkn = [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])];
    
    return [tkn stringByReplacingOccurrencesOfString:@" " withString:@""];
}