Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone设备令牌-NSData或NSString_Iphone_Device Driver_Token - Fatal编程技术网

Iphone设备令牌-NSData或NSString

Iphone设备令牌-NSData或NSString,iphone,device-driver,token,Iphone,Device Driver,Token,我正在以NSData对象的形式接收iPhone设备令牌。 当我测试我的通知脚本函数时,我只从日志中复制了那个对象,通知运行正常。但是,当我现在尝试自动执行此操作时,我将以变量的形式以ASCII编码字符串的形式发送设备令牌 self.deviceToken = [[NSString alloc] initWithData:webDeviceToken encoding:NSASCIIStringEncoding]; 我得到的字符串有一些时髦的字符,看起来类似于这个“å-0¾fZÿ÷ÊUQüRáq

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

self.deviceToken = [[NSString alloc] initWithData:webDeviceToken encoding:NSASCIIStringEncoding];
我得到的字符串有一些时髦的字符,看起来类似于这个
“å-0¾fZÿ÷ÊUQüRáqEªfÔk«”

当服务器端脚本向该令牌发送通知时,我没有收到任何消息

我需要解码什么东西吗?如何解码


Regardz

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

NSString *deviceToken = [[webDeviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
NSString*deviceToken=[[webDeviceToken描述]stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@”“];
deviceToken=[deviceToken StringByReplacingOfString:@“with String:@”的发生率];

我认为这不是一个好的解决方案,因为在将通知发送到苹果服务器之前,必须重新构建字符串。使用Base64编码来传输字符串或类似内容。

我发现这个解决方案更好,因为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];
}


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

将设备令牌转换为十六进制字符串的另一种方法

NSUInteger capacity = [deviceToken length] * 2;
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity];
const unsigned char *dataBuffer = [deviceToken bytes];
NSInteger i;
for (i=0; i<[deviceToken length]; ++i) {
    [stringBuffer appendFormat:@"%02X", (NSUInteger)dataBuffer[i]];
}
NSLog(@"token string buffer is %@",stringBuffer);
nsuiger容量=[deviceToken长度]*2;
NSMutableString*stringBuffer=[NSMutableString stringWithCapacity:capacity];
常量无符号字符*dataBuffer=[deviceToken字节];
恩森特格尔一世;

对于(i=0;i如果有人正在寻找在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)")
}

对于Swift 3:

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

    print(tokenString)
把这个分机叫进来

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let tokenString = deviceToken.hexString()
    print("token: \(tokenString)")
}

发送的字符串可以从服务器端工作,没有任何重建或修改,但据我所知,您正在删除和修剪字符…您是否尝试使用该令牌发送通知,结果成功了?为什么?我在这里找到了另一个解决方案,看起来比“描述”更能证明未来方法。这很奇怪,我认为这个NSData*不应该是特殊类型的对象,所以我尝试使用NSUTF8StringEncoding并得到不同的结果。我无法使用描述方法将NSData转换为NSString!一些与苹果文档相关的?Thx!正是我所需要的!令人惊讶的是,swift中没有简单的方法来获得相应的数据从NSData设备令牌对象解码字符串数据。但这是@sascha的示例,这是我遇到的第一个真正有效的示例!谢谢。现在将其移动到NSData扩展名,并将其命名为
hexadecimalStringDescription()
不要依赖.description,您从中获得的格式是未记录的,在技术上可能会更改。deviceToken.description应仅用于调试目的。请使用将字节转换为十六进制字符串的答案之一。同意。不要使用此选项。使用PKPushCredentials时,description现在返回“32字节”请停止对此答案进行投票,这使用了令牌.description-这只是一个描述。它是为了调试或显示而由人读取的。“”不是令牌的一部分,它们只是用于显示格式。苹果可以将其更改为“[”或“-”或者将来他们想要的任何东西。使用其中一个答案将数据转换为十六进制字符串。
extension Data {
    var hexString: String {
        return map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
    }
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let tokenString = deviceToken.hexString()
    print("token: \(tokenString)")
}