我们有一个使用火力地堡云消息驱动应用程序内聊天功能,跨平台的应用程序。 有些用户可能会积极地使用应用程序多台设备上。 所以,每当用户设备接收的onTokenRefresh
触发,我们发送新的注册令牌服务器保存对用户。 现在说用户已经存储在服务器数据库中的一些注册标记,我们怎么会知道这些标记是同一设备,现在应该被删除,或者如果它们是不同的设备,我们应该继续发送给所有的人?
我已阅读上的设备组信息文件 ,但它看起来像我们的应用程序的开销太大,它看起来并不像火力地堡服务器将自动删除该组的替代注册令牌你。
如果我们简单地假设上记录所有用户的注册标记是活动的,向所有,我们可以使用响应,以决定是否需要进行修剪服务器上的令牌?
{
"multicast_id": 6538766984100364080,
"success": 1,
"failure": 0,
"canonical_ids": 0,
"results": [
{
"message_id": "0:1510294979553090%029da28f029da28f"
}
]
}
根据这个答案 ,并针对与更换令牌的HTTP API一些测试,它看起来并不像在"success":1
的结果是一个可靠的指标,该令牌不应该被删除,因为更换令牌往往生活。 此外, "success": 0
的结果可能不是一个可靠的指标,我们可以删除标记,因为它可能只是表明在一个有效的令牌的ad-hoc网络错误。
该API文档有关如何解释一个可选的会谈registration_id
的结果,而是如何从不同尚不清楚NotRegistered
错误,最好的行动就是采取什么。
如何处理和管理服务器上的FCM设备令牌的到来,任何见解或最佳实践将非常感激。
我也遇到了确切的挑战和必须解决的一个解决方案:存储每个令牌对设备ID的用户。 这是很有趣,足以知道,这个功能其实在火力消息传递方法存在。 但更令人惊讶的是,有没有文件来处理这样的情况。 https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId.html#getId()
因此,在总结,同时发送新的令牌服务器,还沿着由getId()方法返回的设备ID发送,并用它来执行每个设备令牌的唯一性。
问题解决:d
我们正与方法要去的地方,我们假设所有onTokenRefresh
ID是我们添加到服务器上的设备列表中新的,额外的设备。 然后,每当我们发送一个消息,我们使用返回的结果删除或替换过时的设备令牌。 实现在PHP中:
// $devices is a list of the device ids to send to
// 1. send a message to a list of devices
$response = Firebase::request('POST', 'send', ['json' => $this->payloadFor($devices)]);
// 2. check the response to see if we need to make changes to the device list
// if it is a network error, no changes needed
if ($response->getStatusCode() != 200) {
Log::info("FCM http error " . $response->getStatusCode());
return;
}
$body = json_decode($response->getBody(), $asArray = true);
// do we need to dig deeper?
if ($body['failure'] == 0 && $body['canonical_ids'] == 0) return;
if (count($body['results']) != count($devices)) {
Log::info("FCM error : device count not matching result count");
return;
}
// we have errors that need processing, so step through the results list
foreach ($body['results'] as $key => $result) {
if (isset($result['error'])) {
switch ($result['error']) {
case 'NotRegistered':
case 'InvalidRegistration':
$deletedRows = Device::where('token', $devices[$key])->delete();
Log::info("FCM trimmed: $devices[$key]");
break;
default:
Log::info("FCM error " . $result['error']);
break;
}
}
// we need to update some device tokens
if (isset($result['registration_id'])) {
Device::deprecate($devices[$key], $result['registration_id']);
Log::info("FCM replaced: " . $devices[$key]);
}
}