Google Home SYNC 和 ReportState "online" 值似乎未被 iOS 客户端读取,但 Android 正常
Google Home SYNC and ReportState "online" values don't seem to be read by iOS client but Android is OK
问题
在完成 SYNC 请求、QUERY 请求和 ReportState 调用时,我将所有设备报告为 "online": true
。我可以看到这个值被 Google 正确读取,因为这些值似乎是在 ReportState Dashboard 测试工具上设置的。 Android 工作正常,在简短查询 ("Connecting...") 后显示设备在线 ("Linked to you")。相反,当使用 iOS 移动客户端时,当用户进入设备页面时,它只会进行查询,然后将设备报告为离线。仪表板和 JSON 对呼叫的响应都显示 "online": true
。如果用户尝试与设备交互,例如打开它,它就会工作。
查询响应
{
"requestId": "ARequestId",
"payload": {
"devices": [{
"id": "ADeviceId",
"online": true,
"status": "SUCCESS"
}]
}
}
备注
这可能是 iOS 客户端中的错误,但似乎更有可能是我的代码中的错误或我的误解,因为这是我的第一个 Smart Home Action。
我试过在所有地方都包含 "online": true
,例如在 SYNC、QUERY 和 ReportState 调用中。这至少让仪表板了解初始在线状态,但对 iOS 客户端没有帮助。
总的来说,ReportState 似乎工作正常,因为我的更改反映在仪表板中。
截图
注意测试工具的状态与iOS客户端的指示之间的矛盾。
ReportState Dashboard showing online=true
iOS Google Home Client showing same device as offline
离开这个项目大约一年后,我又回到了这个问题上。原来这其实是因为误读了QUERY Intent的响应结构。 SYNC Intent 需要一个带有“id”字段的对象数组。 QUERY Intent 需要一个由 id 键控的字典。
奇怪的是,即使这是后端到后端,并且 Google 端没有抛出任何错误,Android 客户端似乎可以很好地处理这个问题,但是 iOS 客户没有。
本质上,是的,iOS 的某处存在一个错误,它的行为应该与 Android 相同,同样,对于错误的请求,应该有一个 400 错误格式,但错误本质上是在我的响应结构中。
正确的 SYNC Intent 响应
[
{
"id": "DeviceId1",
"online": true,
"status": "SUCCESS"
},
{
"id": "DeviceId2",
"online": true,
"status": "SUCCESS"
}
]
我错误的 QUERY Intent 响应(与正确的 SYNC 相同)
[
{
"id": "DeviceId1",
"online": true,
"status": "SUCCESS"
},
{
"id": "DeviceId2",
"online": true,
"status": "SUCCESS"
}
]
正确的查询意图响应(键控字典,而不是数组)
{
"DeviceId1" :
{
"online": true,
"status": "SUCCESS"
},
"DeviceId2" :
{
"online": true,
"status": "SUCCESS"
}
}
所以尽管 iOS 和 Android 中的紧急行为不同,但一直都是我。这是一个很容易错过的失误。希望这对某人有所帮助,因为没有返回错误意味着这个错误令人气愤。
问题
在完成 SYNC 请求、QUERY 请求和 ReportState 调用时,我将所有设备报告为 "online": true
。我可以看到这个值被 Google 正确读取,因为这些值似乎是在 ReportState Dashboard 测试工具上设置的。 Android 工作正常,在简短查询 ("Connecting...") 后显示设备在线 ("Linked to you")。相反,当使用 iOS 移动客户端时,当用户进入设备页面时,它只会进行查询,然后将设备报告为离线。仪表板和 JSON 对呼叫的响应都显示 "online": true
。如果用户尝试与设备交互,例如打开它,它就会工作。
查询响应
{
"requestId": "ARequestId",
"payload": {
"devices": [{
"id": "ADeviceId",
"online": true,
"status": "SUCCESS"
}]
}
}
备注
这可能是 iOS 客户端中的错误,但似乎更有可能是我的代码中的错误或我的误解,因为这是我的第一个 Smart Home Action。
我试过在所有地方都包含 "online": true
,例如在 SYNC、QUERY 和 ReportState 调用中。这至少让仪表板了解初始在线状态,但对 iOS 客户端没有帮助。
总的来说,ReportState 似乎工作正常,因为我的更改反映在仪表板中。
截图
注意测试工具的状态与iOS客户端的指示之间的矛盾。
ReportState Dashboard showing online=true
iOS Google Home Client showing same device as offline
离开这个项目大约一年后,我又回到了这个问题上。原来这其实是因为误读了QUERY Intent的响应结构。 SYNC Intent 需要一个带有“id”字段的对象数组。 QUERY Intent 需要一个由 id 键控的字典。
奇怪的是,即使这是后端到后端,并且 Google 端没有抛出任何错误,Android 客户端似乎可以很好地处理这个问题,但是 iOS 客户没有。
本质上,是的,iOS 的某处存在一个错误,它的行为应该与 Android 相同,同样,对于错误的请求,应该有一个 400 错误格式,但错误本质上是在我的响应结构中。
正确的 SYNC Intent 响应
[
{
"id": "DeviceId1",
"online": true,
"status": "SUCCESS"
},
{
"id": "DeviceId2",
"online": true,
"status": "SUCCESS"
}
]
我错误的 QUERY Intent 响应(与正确的 SYNC 相同)
[
{
"id": "DeviceId1",
"online": true,
"status": "SUCCESS"
},
{
"id": "DeviceId2",
"online": true,
"status": "SUCCESS"
}
]
正确的查询意图响应(键控字典,而不是数组)
{
"DeviceId1" :
{
"online": true,
"status": "SUCCESS"
},
"DeviceId2" :
{
"online": true,
"status": "SUCCESS"
}
}
所以尽管 iOS 和 Android 中的紧急行为不同,但一直都是我。这是一个很容易错过的失误。希望这对某人有所帮助,因为没有返回错误意味着这个错误令人气愤。