如何将 iOS 设备令牌字符串转换回 NSData

Mik*_*ogg 2 objective-c push-notification ios

我确定这个问题以前已经被问过,但对于我的生活,我找不到正确的答案。

在 Objective-C 中,你有这个:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
Run Code Online (Sandbox Code Playgroud)

太好了,deviceToken 不是字符串,因此通常您将其转换为字符串并将其发送到需要 NSData 的方法(确切目标示例:

[[ETPush pushManager] registerDeviceToken:deviceToken];
Run Code Online (Sandbox Code Playgroud)

这一切都很好:)

问题是,在我的设置中,我从原始 deviceToken 函数外部调用该方法,所以我实际上已经可以将令牌作为字符串访问。所以我需要做的是将该字符串转回deviceToken NSData 对象。我可以这样做将其转换为 NSData 对象:

NSData *deviceToken = [stringToken dataUsingEncoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

但问题是,当我查看描述时,我会得到类似的信息:

<63333833 30613765 ... 64386561 30653861 61356164 31353338 35623665 34396563>
Run Code Online (Sandbox Code Playgroud)

如果您查看问题的每一个实现,如何将 NSData 设备令牌转换为 NSString?他们用这样的东西(或类似的东西使用字节)回答:

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

正如您所想象的那样,将我发布的字符串放在上面并在该方法中使用它,它会创建如下内容:

6333383330613765....etc.
Run Code Online (Sandbox Code Playgroud)

这显然不是我的设备令牌:)

所以问题!

如何将其转换回可以发送给这些方法的 NSData 对象?

Mik*_*ogg 5

我知道了!我能够使用这个非常有用的链接来做到这一点:

http://iphoneappcode.blogspot.com/2012/04/nsdata-to-hexstring-and-hexstring-to.html

- (NSData *)dataFromHexString:(NSString *)string
{
    NSMutableData *stringData = [[[NSMutableData alloc] init] autorelease];
    unsigned char whole_byte;
    char byte_chars[3] = {'\0','\0','\0'};
    int i;
    for (i=0; i < [string length] / 2; i++) {
        byte_chars[0] = [string characterAtIndex:i*2];
        byte_chars[1] = [string characterAtIndex:i*2+1];
        whole_byte = strtol(byte_chars, NULL, 16);
        [stringData appendBytes:&whole_byte length:1];
    }
    return stringData;
}
Run Code Online (Sandbox Code Playgroud)

进而:

NSData *deviceToken = [self dataFromHexString:myStringToken];
Run Code Online (Sandbox Code Playgroud)

:)