如何处理火力地堡云端通讯onTokenRefresh在后端(How to handle Fireba

2019-09-28 15:59发布

我们有一个使用火力地堡云消息驱动应用程序内聊天功能,跨平台的应用程序。 有些用户可能会积极地使用应用程序多台设备上。 所以,每当用户设备接收的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设备令牌的到来,任何见解或最佳实践将非常感激。

Answer 1:

我也遇到了确切的挑战和必须解决的一个解决方案:存储每个令牌对设备ID的用户。 这是很有趣,足以知道,这个功能其实在火力消息传递方法存在。 但更令人惊讶的是,有没有文件来处理这样的情况。 https://firebase.google.com/docs/reference/android/com/google/firebase/iid/FirebaseInstanceId.html#getId()

因此,在总结,同时发送新的令牌服务器,还沿着由getId()方法返回的设备ID发送,并用它来执行每个设备令牌的唯一性。

问题解决:d



Answer 2:

我们正与方法要去的地方,我们假设所有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]);
    }
}


文章来源: How to handle Firebase Cloud Messaging onTokenRefresh on the back end