当我使用像1088337848880612568这样的长变量创建PN有效负载时,它似乎转换为" 1.088337848880613e + 18"。我在发送给Apple之前看到1088337848880612568,但是在应用程序中:didReceiveRemoteNotification:userinfo确实具有" 1.088337848880613e + 18"的价值。
有人知道这是为什么吗?与此同时,我计划使用字符串而不是长值。我对任何遇到同样问题的人感到好奇。
编辑:
推送前的代码:
$body['aps'] = array(
'alert' => $message,
'sound' => 'default',
);
$body['id'] = array('id' => 1088337848880612568);
$payload = json_encode($body);
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceTokenToSendTo) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
fclose($fp);
var_dump($msg);
这是$ msg的var_dump:
string(123) " �e3i�Nίi5J/h=�
��"�+�"�����V{"aps":{"alert":"Blah 07:11:31 PM","sound":"default"},"id":{"id":1088337848880612568}}"
最后在iOS客户端:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"userInfo %@", userInfo);
这会产生输出:
aps = {
alert = "Blah 07:10:46 PM";
sound = default;
};
id = {
id = "1.088337848880613e+18";
};
}
答案 0 :(得分:1)
显示您发送的长度的方式取决于您用于生成要发送给Apple的JSON字符串有效内容的JSON库。例如,我使用的JSON库将每个数字转换为String(使用java toString ()
方法),并且不会产生您经历的转换。但是,当iOS将JSON有效负载传递给您的应用时,它可能会执行您所经历的转换。
由于您将JSON字符串(编码为字节)传递给Apple,因此当您在JSON对象中传递long而不是String时,所有保存的是围绕字符串的两个"
字符但是#39; t围绕一个数字,所以你使用字符串而不是长值的解决方案可能已经足够了。您可以通过将long转换为十六进制字符串(甚至更高的基数)来改进它,与发送十进制字符串相比,这可以节省几个字符。
看到您的有效负载后,而不是发送"id":{"id":1088337848880612568}
您可以发送"id":"1088337848880612568"
,这可以避免您的问题,并且仍然比原始JSON占用更少的字节。
答案 1 :(得分:0)
我会使用像Charles Proxy这样的网络嗅探器来查看服务器的确切内容。
有一些Apple代码正在从服务器收到的数据中创建NSDictionary
。 NSDictionary
不能包含整数,它们必须表示为NSNumber
。
产生输出的代码:
NSLog(@"userInfo %@", userInfo);
所以你看到的是description
NSDictionary
方法决定使用的表示。这是一个展示工件。
尝试:
NSNumber *idNumber = userInfo[@"id"][@"id"];
NSLog(@"idNumber: %lu", [idNumber longValue]);
你应该得到:
idNumber:1088337848880612568