-1103 错误域=NSURLErrorDomain 代码=-1103 "resource exceeds maximum size" iOS 13

-1103 Error Domain=NSURLErrorDomain Code=-1103 "resource exceeds maximum size" iOS 13

当 iOS 13 上的响应有点大 (14kb) 时,我们面临以下网络错误。

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

因为我们使用的是 Alamofire,所以这个问题被视为错误结果,这破坏了我们对结果的处理。

奇怪的是,如果我们直接使用NSURLSession,虽然从日志中仍然可以看到这个错误,但实际上我们并没有在

的回调中收到它
session.dataTask(with: request) { value, response, error in ... }

所以结果可以正确处理。

这个问题以前没见过。有人对此有所了解吗?

终于找到答案了。对于 GET 服务,我试图添加一个 httpBody。像这样:

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

解决方案只是添加一个 if 以避免在 httpMethod 是 GET 时出现该代码块。似乎 iOS 13 新行为和 Swift 给出的错误消息绝对没有帮助

在 Slack 社区的帮助下,我们找到了答案 on iOS13, it is not allowed to add a body in GET request. 要让它再次工作,我们可以切换到 POST/PUT 请求或通过 GET 请求的 url 参数添加正文值。

Alamofire:你应该试试这个!

Alamofire.request(urlString, method: .get, parameters: parameters, encoding: URLEncoding.queryString)

只是避免 httpBody 用于 GET API 请求。

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

#或

对于 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: "&")
    }
}

我只在使用 Xcode 11 构建时看到此问题。如果我恢复到 Xcode 10.3,我将不再遇到同样的问题。虽然不是永久修复,但如果您需要推出代码,您可以恢复,直到您有时间修复它。

我遇到这个问题是因为我在发送获取请求时在 Alamofire 中传递了空参数。所以,我没有发送空参数,而是简单地将它替换为 nil。

GET 请求中传递查询参数,如下所示:

let parameters: Parameters = [
    "param": value
]
Alamofire.request(urlString, method: .get, parameters: parameters, encoding: URLEncoding.queryString)

我使用默认 url 编码而不是默认 json 编码,它对我有用。

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

如果您使用 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)
    }
}

我遇到了同样的问题,正在寻找解决方案。

使用 GET 时不能在正文中传递参数。

如果 API 支持,则使用 POST 方法,或者像下面那样在 URL 中传递它。

AnyURL?Parameter=Value&Parameter=Value

我的解决方法是只将 .parameters 设置为 nil,然后一切正常。因为在Swift里面还是初始化了.parameters.

的值

self.request.parameters = nil

此处您可能遗漏了要传递给数据任务的 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.