iOS推送通知有效负载是否将长整数转换为科学计数法?

时间:2014-04-29 18:25:47

标签: ios push-notification apple-push-notifications

当我使用像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";
    };
}

2 个答案:

答案 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代码正在从服务器收到的数据中创建NSDictionaryNSDictionary不能包含整数,它们必须表示为NSNumber

产生输出的代码:

NSLog(@"userInfo %@", userInfo);

所以你看到的是description NSDictionary方法决定使用的表示。这是一个展示工件。

尝试:

NSNumber *idNumber = userInfo[@"id"][@"id"];
NSLog(@"idNumber: %lu", [idNumber longValue]);

你应该得到:
idNumber:1088337848880612568