繁体   English   中英

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

[英]Firestore Messaging: Sending message to Topic with Swift

我正在将我的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 =(旧版服务器密钥)

可以解决此授权错误的任何帮助将不胜感激!

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM