-1103 Error Domain = NSURLErrorDomain Code = -1103 ресурс превышает максимальный размер iOS 13

Мы сталкиваемся со следующей сетевой ошибкой, когда ответ какой-то большой (14 КБ) на iOS 13.

[-1103] Error Domain=NSURLErrorDomain Code=-1103 "resource exceeds maximum size"

Поскольку мы используем Alamofire, эта проблема рассматривается как результат ошибки, которая нарушает нашу обработку результатов.

Странно то, что если мы используем NSURLSession напрямую, хотя эта ошибка все еще видна из журнала, мы фактически не получаем ее в обратном вызове

session.dataTask(with: request) { value, response, error in ... }

Так что к результату можно относиться правильно.

Такой проблемы раньше не было. У кого-нибудь есть представление об этом?


person Jibeex    schedule 09.07.2019    source источник
comment
У меня такая же проблема. В настоящее время используется macOs 10.15 beta 3 и iOS 13 beta 3. Не уверен, имеет ли это какое-то отношение к бета-версиям.   -  person user3175133    schedule 10.07.2019
comment
ios13 не позволяет запросам GET иметь тело. если ваш бэкэнд позволяет, используйте метод POST   -  person Fabiosoft    schedule 11.07.2019
comment
Но он отлично работает с live ios13, проблемы возникают, когда вы разрабатываете с xcode 11 ios 13.   -  person Moin Shirazi    schedule 03.10.2019
comment
@MoinShirazi проблема появляется только при компиляции с iOS 13+ sdk   -  person Radu Ursache    schedule 08.10.2019


Ответы (10)


С помощью сообщества Slack мы находим ответ: on iOS13, it is not allowed to add a body in GET request. Чтобы заставить его снова работать, мы можем либо переключиться на запрос POST / PUT, либо добавить значение тела через параметры url запроса GET.

person Jibeex    schedule 10.07.2019
comment
спасибо, в каком сообществе Slack вы обсуждаете, у меня была такая же проблема. Также я столкнулся с другой проблемой в iOS 13 с FileManager. stackoverflow.com/ questions / 58081267 / - person manukv; 26.09.2019

Передайте параметры запроса в GET запросе, как показано ниже:

let parameters: Parameters = [
    "param": value
]
Alamofire.request(urlString, method: .get, parameters: parameters, encoding: URLEncoding.queryString)
person smartwolf    schedule 13.12.2019
comment
Это помогает. Но почему? Пожалуйста, объясни - person rommex; 21.02.2020

Наконец нашел ответ. Для служб GET я пытался добавить httpBody. Что-то вроде этого:

do {
    request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
    errorCompletion(error)
    return
}

Решением было просто добавить if, чтобы избежать этого фрагмента кода, если httpMethod является GET. Похоже на новое поведение iOS 13, и сообщение об ошибке, данное Swift, определенно не помогает.

person user3175133    schedule 10.07.2019
comment
но как тогда передать параметры? - person Vincent Joy; 17.10.2019

У меня такая же проблема, и я ищу решение.

Вы не можете передавать параметр в теле при использовании GET.

Либо используйте метод POST, если API поддерживает, либо передайте его в URL-адресе, как показано ниже.

AnyURL? Параметр = Значение & Параметр = Значение

person Hardik Vyas    schedule 14.02.2020

Просто избегайте httpBody для GET запроса API.

if requestType != .get{
     request.httpBody = data
}

OR

Для GET запроса добавьте параметр в URL вместо HTTP body

Используйте указанное ниже расширение, чтобы создать параметр запроса из словаря.

extension NSObject {
    func buildQueryString(fromDictionary parameters: [String:String]) -> String {
        var urlVars = [String]()
        for (var k, var v) in parameters {
            let characters = (CharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as! NSMutableCharacterSet
            characters.removeCharacters(in: "&")
            v = v.addingPercentEncoding(withAllowedCharacters: characters as CharacterSet)!
            k = k.addingPercentEncoding(withAllowedCharacters: characters as CharacterSet)!
            urlVars += [k + "=" + "\(v)"]
        }

        return (!urlVars.isEmpty ? "?" : "") + urlVars.joined(separator: "&")
    }
}

Все работает как шарм, вот и все.

person Hitesh Surani    schedule 13.09.2019

Я использовал кодировку url по умолчанию вместо кодировки json по умолчанию, и у меня это сработало.

Alamofire.request(url, method: .get, parameters: param, encoding: URLEncoding.default)

OR

Если вы используете URLRequestConvertible

enum NetworkRouter: URLRequestConvertible {

    case someCase(lang:String)

    var method: HTTPMethod {
        return .get
    }

    var parameters: Parameters? {
        switch self {
        case .someCase(let param):
            return ["lang": param.lang]
        default:
            return nil
        }
    }

    var url: URL {
        switch self {
        case .someCase(let param):
            return URL(string: Constants.baseURL + Constants.endPoint)!
        default:
            return URL(string: Constants.baseURL)!
        }
    }

    var encoding: ParameterEncoding {
        return URLEncoding.default
    }

    func asURLRequest() throws -> URLRequest {
        var urlRequest = URLRequest(url: url)
        urlRequest.httpMethod = method.rawValue
        return try encoding.encode(urlRequest, with: parameters)
    }
}

person Yasir N.Romaya    schedule 29.01.2020

У меня возникла эта проблема, потому что я передаю пустые параметры в Alamofire при отправке запроса на получение. Итак, вместо отправки пустых параметров я просто заменяю их на nil.

person Evgeniy Kleban    schedule 26.09.2019

Я вижу эту проблему только при сборке с Xcode 11. Если я вернусь к Xcode 10.3, у меня больше не будет такой проблемы. Хотя это и не навсегда, но если вам нужно выпустить код, вы можете вернуться к нему, пока у вас не будет времени исправить это.

person Will    schedule 25.09.2019

Мое исправление - я установил только .parameters в ноль, тогда все работает нормально. Потому что в Swift он по-прежнему инициализирует значение .parameters.

self.request.parameters = nil

person Aika Melanie Dionisio    schedule 29.01.2021

Здесь вы могли пропустить метод URL-запроса, который вы передаете в задачу данных. Вы должны добавить POST / PUT / DELETE в параметр метода запроса URL-адреса, как показано ниже.

var request: URLRequest = URLRequest(url: SOME_VALID_URL) 
request.body = SOME_VALID_DATA_IN_BYTES
request.method = "post" --> You are missing this.
person Gavara.Suneel    schedule 02.05.2021