FCM是否会显示以前使用的令牌不再可用?什么时候?

时间:2018-08-09 18:31:23

标签: android firebase firebase-cloud-messaging

想象一个用户安装并打开我的应用程序。将生成FCM注册令牌并将其发送到我的服务器。稍后,说用户清除了我的应用程序数据。然后,当他打开应用程序时,将生成一个新令牌。因此,由于还没有办法让我知道这一点,因此我也按照旧注册的常规发送通知。现在:

  1. FCM是否会假定设备处于脱机状态,并继续尝试发送通知,直到其生命周期结束(默认为4周)?

  2. 如果不是,则返回注册令牌未注册错误需要多长时间?

1 个答案:

答案 0 :(得分:0)

  1. 否。 FCM服务器将知道令牌已立即过期。

  2. 从#1开始,它将立即发送回去。

在这里可能令人困惑的是您实际收到func sendRequest<T: Decodable>(api: String, parameters: [String: Any]? = nil, outputBlock: @escaping (T) -> () ) { guard let url = URL(string: api) else {return} print("hitting : -", url.absoluteString) var request = URLRequest(url: url) if let parameters = parameters { request.httpMethod = "POST" var postArr = [String]() for(key, value) in parameters { postArr.append(key + "=\(value)") } let postString = postArr.map { String($0) }.joined(separator: "&") request.httpBody = postString.data(using: .utf8) if let data = request.httpBody, let str = String(data: data, encoding: String.Encoding.utf8) { print(str) } } URLSession.shared.dataTask(with: request) { (data, response, error) in DispatchQueue.main.async { Indicator.shared.hideProgressView() if let err = error { print(err.localizedDescription) return } guard let data = data else {return} do { let obj = try JSONDecoder().decode(T.self, from: data) outputBlock(obj) } catch let jsonErr { print(jsonErr) } } }.resume() 错误的步骤。这是两种可能的情况:

  1. 设备已安装的应用程序。令牌已生成并发送到您的服务器。
  2. 您将推送通知发送到令牌。
  3. FCM服务器检查,令牌仍然有效,并在可行的情况下将要发送的消息排入队列。

下一个来自您的场景:

  1. 设备已安装的应用程序。令牌已生成并发送到您的服务器。
  2. 用户下线并清除应用数据。以前的令牌现在无效,但是由于设备处于脱机状态,因此尚未通知InstanceID服务。
  3. 您将推送通知发送到令牌。 FCM认为该令牌有效,并向您发送成功响应,并在可行的情况下将要发送的消息排入队列。

    此处,令牌当前仍有效。这样您将收到像往常一样的成功回复。

  4. 设备在线。 InstanceID服务进行同步,让其知道旧令牌现在无效,并请求新令牌。生成新令牌。 4.5设备几乎同时在线,FCM会检查令牌是否仍然有效。如果没有,那么它将丢弃排队的消息。

要永远记住的事情是,FCM正在充当中间人。希望这可以清除一切。干杯!