iOS:通过URL请求向Firebase服务发送推送通知

5
我正在构建一个测试应用程序以发送推送通知,以下是我的代码:

static func sendRequestPush(){
        let json: [String: Any] = ["to": "key",
                                   "priority": "high",
                                   "notification": ["body":"Hello1", "title":"Hello world","sound":"default"]]
    let urlStr:String = "https://fcm.googleapis.com/fcm/send"
    let url = URL(string:urlStr)
    let jsonData = try? JSONSerialization.data(withJSONObject: json)
    var request = URLRequest(url: url!)
    request.httpMethod = "POST"
    request.httpBody = jsonData
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print(error?.localizedDescription ?? "No data")

            return
        }
        let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
        if let responseJSON = responseJSON as? [String: Any] {
            print(responseJSON)
        }
    }

    task.resume()
}

问题是我从googleapis和推送通知都没有得到任何响应。我可以从仪表板上收到推送通知,但从我的代码中却无法接收。

你们有没有人知道我做错了什么?

非常感谢你们的帮助。


请看这里 https://stackoverflow.com/questions/51108703/firebase-push-notifications-with-swift-not-working-in-ios-11-4/51115312#51115312 - Daniel Ghrenassia
@user2924482 你试过我的答案了吗? - R. Mohan
1个回答

3
尝试下面的代码,它能像魔法一样工作 :)
 func sendRequestPush()  {
    // create the request
    let url = URL(string: "https://fcm.googleapis.com/fcm/send")
    let request = NSMutableURLRequest(url: url!)
    request.httpMethod = "POST"
    request.setValue("key=putYourLegacyServerKeyHere", forHTTPHeaderField: "authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let parameters = ["to": "putYourFCMToken",
                               "priority": "high",
                               "notification": ["body":"Hello1", "title":"Hello world","sound":"default"]] as [String : Any]
    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body
    } catch let error {
        print(error.localizedDescription)
    }
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)
    let dataTask = session.dataTask(with: request as URLRequest) { data,response,error in
        let httpResponse = response as? HTTPURLResponse
        if (error != nil) {
            print(error!)
        } else {
            print(httpResponse!)
        }
        guard let responseData = data else {
            print("Error: did not receive data")
            return
        }
        do {
            guard let responseDictionary = try JSONSerialization.jsonObject(with: responseData, options: [])
                as? [String: Any] else {
                    print("error trying to convert data to JSON")
                    return
            }
            print("The responseDictionary is: " + responseDictionary.description)
        } catch  {
            print("error trying to convert data to JSON")
            return
        }
        DispatchQueue.main.async {
            //Update your UI here
        }
    }
    dataTask.resume()
}

"

"putYourLegacyServerKeyHere" 根据您在 FCM 控制台中获得的密钥进行更改

"putYourFCMToken" 用您在 didReceiveRegistrationToken (FCM Delegate) 中获取的 fcm token 进行更改

"

@R Mohan,我尝试了您的解决方案,但是我收到了“RL: https://fcm.googleapis.com/fcm/send } {状态代码:401,标头{”的错误。我正在使用从委托“putYourFCMToken”获取的令牌和仪表板中的“Legacy server key”。您知道我为什么会收到“401”吗? - user2924482
@user2924482,状态码401表示身份验证错误。如果您在请求中没有添加Content-Type,它将出现,或者如果您缺少任何参数,如优先级或通知键,它也会返回401。请检查您输入的参数是否正确。 - R. Mohan
有没有办法直接使用Firebase SDK实现相同的功能,而不是使用post url? - Yogendra Patel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接