Firestore消息传递:使用Swift向主题发送消息

时间:2018-08-09 16:15:37

标签: ios swift firebase firebase-cloud-messaging google-cloud-firestore

我正在将我的iOS应用程序从CloudKit转换为Firestore。到目前为止,除通知外,其他所有功能都运行良好。我让用户订阅了特定主题,如果我使用该网站发送消息,该主题将非常有用。

但是,我需要我的iOS应用发送消息,而google提供了有关如何执行此操作的出色文档。他们的说明是

(Send to a single Topic)
POST https://fcm.googleapis.com/v1/projects/myproject-b5ae1/messages:send HTTP/1.1

Content-Type: application/json
Authorization: Bearer (Server Key)
{
  "message":{
    "topic" : "foo-bar",
    "notification" : {
      "body" : "This is a Firebase Cloud Messaging Topic Message!",
      "title" : "FCM Message"
      }
   }
}

因此,为了做到这一点,我决定使用http请求来发布该信息。这是我的代码...

let json: [String: Any] = ["message": ["topic":"\(Items.sharedInstance.clubSelected2.id)", "notification":["body":"Test Body","title":"Test Title"]]]
let jsonData = try? JSONSerialization.data(withJSONObject: json)

let url = URL(string: "https://fcm.googleapis.com/v1/projects/(My Project)/messages:send")!
var request = URLRequest(url: url)

request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer (My Server Key)", forHTTPHeaderField: "Authorization")
request.httpMethod = "POST"
request.httpBody = jsonData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {
        // check for fundamental networking error
        print("error=\(error)")
        return
    }

    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
        print("statusCode should be 200, but is \(httpStatus.statusCode)")
        print("response = \(response)")
    }

    let responseString = String(data: data, encoding: .utf8)
        print("responseString = \(responseString)")
    }
    task.resume()

所有这些,我得到错误“请求具有无效的身份验证凭据。期望的OAuth 2访问令牌,登录cookie或其他有效的身份验证凭据。请参阅https://developers.google.com/identity/sign-in/web/devconsole-project。\”。我创建了新的服务器密钥,但仍然收到相同的错误。以下是我在“授权”字段中尝试过的方法...当然没有括号

  • 载体(服务器密钥)
  • 承载者(新服务器密钥)
  • 载体(旧版服务器密钥)
  • key =(服务器密钥)
  • key =(新服务器密钥)
  • key =(旧版服务器密钥)

在解决此授权错误方面的任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

FCM v1不会仅从服务器发送来自客户端的消息。您需要使用XMPP直接从客户端发送传出消息。就个人而言,我更喜欢从服务器发送。您可以向服务器发送外发请求以处理消息,或触发Cloud Function自动运行。

如果要使用FCM最新版本FCM v1,则需要从服务器发送。 Firebase提供Admin SDKs,使您可以在服务器端访问Firebase产品。然后,您不必处理生成凭据或构建请求。

当通过POST请求而不是通过Admin SDK使用FCM v1端点时,将使用服务帐户密钥JSON文件生成FCM v1的凭据。请参阅guide中的说明。您可以从Firebase控制台here下载文件。选择您的项目以转到仪表板中的位置。该指南中包括用于从文件中获取凭据的代码。