0

所以我的目标是能够触发通知而不会NSCocoaErrorDomain出错。在此问题之前,我在 http 请求中使用此 json 数据向我的单个设备发送了通知:

let paramString: [String : Any] = ["to" : token,
                                       "notification" : ["title" : title, "body" : body],
                                       "data" : ["user" : "test_id"]
    ]

这工作得非常好,基本上等同于下图,但notification添加了一个对象。Firebase 文档

现在我想加强并向订阅主题的人发送通知,所以我将代码和 url 都更改了一点,但是当我按下按钮并且代码运行时,我得到了NSCocoaErrorDomain Code = 3840我的 json 所在的含义无效的格式。

新编辑所以这是我使用的函数和我在 http 请求中的 json:

func sendNotificationToUser(to topic: String, title: String, body: String) {
        
            let urlString = "https://fcm.googleapis.com/v1/projects/myprojectnamehere-41f12/messages:send HTTP/1.1"
            guard let encodedURLString = urlString.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed) else { return }
            let url = URL(string: encodedURLString)!
            let paramString: [String: Any] = [
                                               "message": [
                                                "topic" : topic,
                                                "notification" : [
                                                    "title": title,
                                                    "body": body
                                                ]
                                              ]
                                            ]
            let request = NSMutableURLRequest(url: url as URL)
            request.httpMethod = "POST"
            request.httpBody = try? JSONSerialization.data(withJSONObject: paramString, options: [.prettyPrinted])
            request.setValue("application/json", forHTTPHeaderField: "Content-Type")
            request.setValue("Bearer ya29.\(self.bearer)", forHTTPHeaderField: "Authorization")
            let task = URLSession.shared.dataTask(with: request as URLRequest) { (data, response, error) in
                do {
                    if let jsonData = data {
                        if let jsonDataDictionary = try JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization.ReadingOptions.allowFragments) as? [String: AnyObject] {
                            NSLog("Received data:\n\(jsonDataDictionary))")
                        }
                    }
                } catch let err as NSError {
                    print(err)
                }
            }
            task.resume()
        
    
}

所以回首往事,我不得不修改上面的函数并稍微更改参数,但现在当函数被调用时......

getTheSchoolID { (id) in
            if let id = id {
                self.sendNotificationToUser(to: id, title: "New Event Added!", body: "A new event has been added to the dashboard!!")

            }
        }

我在调试控制台中收到此错误:

错误

我希望它基本上等于 Firebase 文档中的这段代码: json 主题

所以我决定前往jsonlint.com并验证它。我用大括号替换了方括号,在id,body和上加上双引号, titlejson 是完全有效的,但是当我在 Swift 中运行它时,它说它是无效的。我的 HTTP 请求中的id, body,andtitle都是字符串格式,我在上面发布的第一个 json 数据中使用了这 3 个变量中的两个,它工作得非常好,所以我不知道为什么控制台没有启动JSON。如果有人能帮我解决这个问题,那就太棒了。谢谢你。

4

0 回答 0