我怎样才能修复返回 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