php - 同一调用在 Android 和 iOS 上返回不同的 JSON 结果

标签 php android ios c json

背景:

我正在使用通用的 HTTPebble 库为 Pebble Smartwatch 编写一些东西,作为 watch 和手机之间的桥梁。这需要一个特定的 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。在 Android 上,这目前正在按预期工作。但是,在 iOS 上,我似乎总是返回 8 的结果。更进一步,图标通过 Android 返回值 > 50,000(有数据),而在 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 上的解释方式。在 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;

长话短说 移动您的 JSON >> 11,返回到设备,然后在设备的接收阶段取消移动 << 11。

关于php - 同一调用在 Android 和 iOS 上返回不同的 JSON 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17448681/

相关文章:

android - WallpaperService 图像绘制性能

ios - 警报框上的动画

ios - 如何在 iOS Music App 中实现向上滚动时的 UINavigationBar 动画?

php - 如何在 cakephp 2.6 中创建具有可容纳行为的虚拟字段

php - 带有 ibase 查询的递归函数 php

android - 保存/序列化 OkHttp/Retrofit 请求

java - 如何限制Firestore中添加和删除监听器的数量?

ios - 从 iOS 6 在 Twitter 中发帖

PHP MySql 进度条

php - 如何使用自定义登录表单比较 Laravel 的哈希密码?