Search code examples
iosswiftnsurlrequestnsurlsessiondatatask

Request working properly with postman but fails with protocol error when requesting with iOS


I am trying to run this request and the reason I am doing is that from here is that I want to test push notifications (I mean a lot of them) with different strings in a loop.

When I try to do it with Postman it works perfectly fine I mean I had tried sending 300 requests and they worked fine but the request is giving an error when I am doing it with URLSession.

The error which I get on console is- error is there in data task The operation couldn’t be completed. Protocol error 2018-01-10 08:48:47.735403+0530 Universal Time Table[18533:1210462] TIC Read Status [4:0x0]: 1:57 2018-01-10 08:48:47.735555+0530 Universal Time Table[18533:1210462] TIC Read Status [4:0x0]: 1:57

My code for sending requests is -

    func testNotifications(times: Int, completionHandler: @escaping (String) -> Void) {
    print("test notifications called")
    let url = "https://fcm.googleapis.com/fcm/send"
    var urlRequest = URLRequest(url: URL(string: url)!)
    urlRequest.httpMethod = "POST"
    let session = URLSession(configuration: .ephemeral)
    urlRequest.setValue("Content-Type", forHTTPHeaderField: "application/json")
    urlRequest.setValue("Authorization", forHTTPHeaderField: "Key=my_API_KEY")


    do{
        let jsonData = try JSONSerialization.data(withJSONObject: notificationJson, options: .prettyPrinted)
        urlRequest.httpBody = jsonData

    } catch let err as Error{
        print("error is", err.localizedDescription)
    }

    session.dataTask(with: urlRequest) { (data, response, error) in
            if error != nil{
                print("error is there in data task\n", error?.localizedDescription ?? "Error Hard Coded String")
                return
            }
            print("response is", response)
            print("Shoud be a success")
            DispatchQueue.global(qos: .userInitiated).async {
                DispatchQueue.main.async {
                    completionHandler("responseString")
                    print("success")
                }
            }
            }.resume()
}

let notificationJson = [
    "notification":[
        "body" : "This week's edition is now available.",
        "title" : "NewsMagazine.com",
    ],
    "data" : [
        "volume" : "3.21.15",
        "contents" : "http://www.news-magazine.com/world-week/21659772"
    ],
    "android":[
        "priority":"normal"
    ],
    "apns":[
        "headers":[
            "apns-priority":"5",
            "apns-collapse-id": "ON"
        ]
    ],
    "webpush": [
        "headers": [
            "Urgency": "high"
        ]
    ]
    ,
    "to" : "device_token"
    ] as [String : Any]

Solution

  • Your headers are incorrect. You should exchange the key-value pair like this:

    urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
    urlRequest.setValue("Key=my_API_KEY", forHTTPHeaderField: "Authorization")