我怎样才能修复返回 nil 的 urlString 错误
how can I fix this urlString error from returning nil
所以我的目标是成功地向订阅特定主题的用户发送通知而没有错误。我有一个功能,我用它来发送 FCM 通知,这里是:
func sendNotificationToUser(to token: String, title: String, body: String) {
getTheSchoolID { (id) in
if let id = id {
let urlString = "https://fcm.googleapis.com/v1/projects/thenameofmyproject-41f12/messages:send HTTP/1.1"
let url = NSURL(string: urlString)!
let paramString: [String: Any] = ["message": ["topic": id,
"notification": ["title": title, "body": body],
"data": ["user": "test_id"]
]
]
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 \(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.debugDescription)
}
}
task.resume()
}
}
}
我最初是从 Youtube 视频中找到这段代码的,并用我的 iPhone 对其进行了测试,它工作得很好,但我稍微修改了一下,看起来像这样,现在当这个函数得到 运行 我收到一条错误消息,说 urlString
正在生成一个 nil 值。
我从文档中复制了格式,只是把项目名称换掉了,但不知为何还是报错。 url 有什么我看不到的问题吗?另外,在我下面显示的图像中,我应该在我的不记名密钥之前添加“ya29.
”还是这个值就可以了?
不太确定您要做什么,您不会通过直接从客户端应用程序调用 APNS/fcm API 来触发通知,无论如何问题是为什么 URL
为零,好吧,如果你对 url 字符串
进行百分位编码,你可以避免它为 nil
let urlString = "https://fcm.googleapis.com/v1/projects/thenameofmyproject-41f12/messages:send HTTP/1.1"
guard let encodedURLString = urlString.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed) else { return }
let url = URL(string: encodedURLString)! //NSURL(string: encodedURLString)!
您不需要 NSURL
,您可以使用 URL
。
为什么要进行百分位数编码?
因为你的 url 在发送和 HTTP send HTTP
之间有一个白色的 space 并且白色的 space 在有效的 url 中是不允许的,如果你想让白色 space 在你的 URL 中持续存在,你应该对其进行编码。白色 space 将被替换为 %20
所以我的目标是成功地向订阅特定主题的用户发送通知而没有错误。我有一个功能,我用它来发送 FCM 通知,这里是:
func sendNotificationToUser(to token: String, title: String, body: String) {
getTheSchoolID { (id) in
if let id = id {
let urlString = "https://fcm.googleapis.com/v1/projects/thenameofmyproject-41f12/messages:send HTTP/1.1"
let url = NSURL(string: urlString)!
let paramString: [String: Any] = ["message": ["topic": id,
"notification": ["title": title, "body": body],
"data": ["user": "test_id"]
]
]
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 \(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.debugDescription)
}
}
task.resume()
}
}
}
我最初是从 Youtube 视频中找到这段代码的,并用我的 iPhone 对其进行了测试,它工作得很好,但我稍微修改了一下,看起来像这样,现在当这个函数得到 运行 我收到一条错误消息,说 urlString
正在生成一个 nil 值。
我从文档中复制了格式,只是把项目名称换掉了,但不知为何还是报错。 url 有什么我看不到的问题吗?另外,在我下面显示的图像中,我应该在我的不记名密钥之前添加“ya29.
”还是这个值就可以了?
不太确定您要做什么,您不会通过直接从客户端应用程序调用 APNS/fcm API 来触发通知,无论如何问题是为什么 URL
为零,好吧,如果你对 url 字符串
let urlString = "https://fcm.googleapis.com/v1/projects/thenameofmyproject-41f12/messages:send HTTP/1.1"
guard let encodedURLString = urlString.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed) else { return }
let url = URL(string: encodedURLString)! //NSURL(string: encodedURLString)!
您不需要 NSURL
,您可以使用 URL
。
为什么要进行百分位数编码?
因为你的 url 在发送和 HTTP send HTTP
之间有一个白色的 space 并且白色的 space 在有效的 url 中是不允许的,如果你想让白色 space 在你的 URL 中持续存在,你应该对其进行编码。白色 space 将被替换为 %20