-1103错误域=NSURLErrorDomain代码=-1103“;资源超出最大大小“;iOS 13

-1103错误域=NSURLErrorDomain代码=-1103“;资源超出最大大小“;iOS 13,ios,objective-c,swift,ios13,Ios,Objective C,Swift,Ios13,当IOS13上的响应较大(14kb)时,我们将面临以下网络错误 [-1103]错误域=NSURLErrorDomain code=-1103“资源超过最大大小” 当我们使用Alamofire时,这个问题被视为错误结果,这破坏了我们对结果的处理 奇怪的是,如果我们直接使用NSURLSession,尽管这个错误仍然可以从日志中看到,但实际上我们并没有在 session.dataTask(with: request) { value, response, error in ... } 因此,可以正确

当IOS13上的响应较大(14kb)时,我们将面临以下网络错误

[-1103]错误域=NSURLErrorDomain code=-1103“资源超过最大大小”

当我们使用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
}

如果httpMethod是一个GET,那么解决方案就是添加一个if来避免这段代码。似乎是iOS 13的新行为,而Swift给出的错误消息毫无帮助

在Slack社区的帮助下,我们发现答案是
在iOS13上,不允许在GET请求中添加body。
要使其再次工作,我们可以切换到POST/PUT请求,或者通过GET请求的url参数添加body值。

只需避免
GET
API请求的
httpBody

if requestType != .get{
     request.httpBody = data
}
对于
GET
请求,将参数附加到URL中,而不是
HTTP正文

使用下面的扩展名从字典创建查询参数

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,我就不会再有同样的问题了。虽然不是永久性的修复,但如果您需要推出代码,可以在有时间修复之前进行还原。

我遇到了这个问题,因为我在发送get请求时在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中传递它

var request: URLRequest = URLRequest(url: SOME_VALID_URL) 
request.body = SOME_VALID_DATA_IN_BYTES
request.method = "post" --> You are missing this.
AnyURL?参数=值&参数=值


我的解决办法是我只将
.parameters
设置为nil,然后一切正常。因为在Swift中,它仍然初始化
.parameters
的值


self.request.parameters=nil

此处您可能缺少传递给数据任务的URL请求的方法。您必须向URL请求方法参数添加POST/PUT/DELETE,如下所示

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

我也有同样的问题。目前正在使用macOs 10.15 beta 3和iOS 13 beta 3。不确定它是否与betasios13有关,它阻止GET请求拥有一个主体。如果您的后端允许,请使用POST方法,但它在live ios13上运行得非常好,当您使用xcode 11 ios 13进行开发时会出现问题。@MoinShirazi该问题仅在您使用ios 13+sdkthanks进行编译时出现,您正在讨论的Slack社区中,我也遇到了同样的问题。在iOS 13中,我还面临另一个与FileManager有关的问题。但是你将如何传递参数呢?这很有帮助。但是为什么呢?请解释一下