所以我的目标是能够触发通知而不会NSCocoaErrorDomain
出错。在此问题之前,我在 http 请求中使用此 json 数据向我的单个设备发送了通知:
let paramString: [String : Any] = ["to" : token,
"notification" : ["title" : title, "body" : body],
"data" : ["user" : "test_id"]
]
这工作得非常好,基本上等同于下图,但notification
添加了一个对象。
现在我想加强并向订阅主题的人发送通知,所以我将代码和 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!!")
}
}
我在调试控制台中收到此错误:
所以我决定前往jsonlint.com并验证它。我用大括号替换了方括号,在id
,body
和上加上双引号, title
json 是完全有效的,但是当我在 Swift 中运行它时,它说它是无效的。我的 HTTP 请求中的id, body,
andtitle
都是字符串格式,我在上面发布的第一个 json 数据中使用了这 3 个变量中的两个,它工作得非常好,所以我不知道为什么控制台没有启动JSON。如果有人能帮我解决这个问题,那就太棒了。谢谢你。