Iphone设备令牌 - NSData或NSString

Mla*_*den 33 iphone token device-driver

我正在以NSData对象的形式接收iPhone设备令牌.当我测试我的通知脚本功能时,我只从日志中复制了该对象,并且通知正常.但是,当我现在尝试自动执行此操作时,我将以变量的形式将设备令牌作为ASCII编码的字符串发送

self.deviceToken = [[NSString alloc] initWithData:webDeviceToken encoding:NSASCIIStringEncoding];
Run Code Online (Sandbox Code Playgroud)

我得到的字符串有一些时髦的字符,看起来与此类似 "å-0¾fZÿ÷ʺÎUQüRáqEªfÔk«"

当服务器端脚本将通知发送到该令牌时,我没有收到任何内容.

我需要解码一些东西吗?

Regardz

Mla*_*den 108

好的,我找到了解决方案.如果有人有同样的问题,忘记ASCII编码,只需使用以下行生成字符串:

NSString *deviceToken = [[webDeviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
Run Code Online (Sandbox Code Playgroud)

  • 请停止提示这个答案,这使用令牌.description - 这就是说明.它意味着由人阅读以进行调试或显示."<"和">"不是令牌的一部分,它们仅用于显示格式.如果他们想要,Apple可以将其改为"["或" - "或将来的任何内容.使用其中一个将数据转换为十六进制字符串的答案. (7认同)

Sas*_*cha 44

如果有人想在Swift中这样做:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    print("tokenString: \(tokenString)")
}
Run Code Online (Sandbox Code Playgroud)

编辑:对于Swift 3

Swift 3引入了Data具有值语义的类型.要将其转换deviceToken为String,您可以执行以下操作:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    var token: String = ""
    for i in 0..<deviceToken.count {
        token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
    }

    print(token)
}
Run Code Online (Sandbox Code Playgroud)


meg*_*gha 5

我发现这个解决方案更好,因为iOS可以在将来的版本中更改描述的用法,因此在将来使用数据的描述属性可能是不可靠的.我们可以通过从数据令牌字节创建十六进制令牌来直接使用它.

 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {
 const unsigned *tokenBytes = [deviceToken bytes];
 NSString *hexToken = [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])];
 [[MyModel sharedModel] setApnsToken:hexToken];
Run Code Online (Sandbox Code Playgroud)

}

我们还可以将设备令牌存储在我们的NSUserdefaults中,稍后使用它将其发送到我们的服务器.