在Android和iOS上,相同的调用返回不同的JSON结果


Same call returning different JSON results on Android vs iOS

背景:

我正在为Pebble智能手表写一些东西,使用通用的HTTPebble库作为手表和手机之间的桥梁。这需要一个特定的iOS应用程序和一个不同的Android应用程序,尽管两者使用相同的框架和库。

问题:

我能够对PHP服务器进行HTTP调用,并成功返回和解码来自Android Gingerbread的JSON元组结果。然而,在iOS设备上使用相同的调用时,我无法收到有效的预期结果。

以下是我用来接收JSON结果的代码:

#define INTRO_DAY1_ICON 1
Tuple*   icon    = dict_find(received,INTRO_DAY1_ICON);
if (icon){
    dayTransition.day[0].currentWeather = icon->value->int8;

我希望icon->value->int8是0、1、2、3、11或99的整数值。在安卓系统上,这目前正在按预期运行。但是,在iOS上,我似乎总是返回8的结果。更进一步,图标通过Android返回的值>50000(有数据),而在iOS上返回的值为0。

更令人困惑的是,提供的示例代码能够在两个设备上返回有效的结果,但用我的代码镜像该功能并不能产生相同的结果。(这意味着从任一设备调用data_tuple时都会填充)该代码如下:

    Tuple* data_tuple = dict_find(received, WEATHER_KEY_CURRENT);
    if(data_tuple) {
         uint16_t value = data_tuple->value->int16;
         uint8_t icon = value >> 11;
         if(icon < 10) {

关于为什么会发生这种情况,有什么想法吗?

我终于想通了!我认为问题在于如何在iOS和Android上解释数据。在安卓系统上,我可以传回任何类型的整数(有符号或无符号,8、16或32位),看起来都会成功。然而,在iOS上,我需要对JSON输出进行逐位移位处理(在编码之前),使其成为一个无符号的16位整数。然后,一旦它回到Pebble,就有代码将无符号的16位整数转换为无符号的8位整数,然后将其分配给标准的c int

uint16_t value1 = icon_tuple1->value->int16;
uint8_t icon1 = value1 >> 11;
dayTransition.day[0].currentWeather = icon1;

TL;DR移动JSON>>11,返回设备,然后取消移动<lt;11处于设备上的接收相位。