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

Posted

技术标签:

【中文标题】-1103 错误域=NSURLErrorDomain 代码=-1103“资源超出最大大小”iOS 13【英文标题】:-1103 Error Domain=NSURLErrorDomain Code=-1103 "resource exceeds maximum size" iOS 13 【发布时间】:2019-07-09 15:07:27 【问题描述】:

当响应在 ios 13 上过大(14kb)时,我们会遇到以下网络错误。

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

当我们使用 Alamofire 时,这个问题被视为错误结果,这会破坏我们对结果的处理。

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

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

所以结果可以正确处理。

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

【问题讨论】:

我遇到了同样的问题。目前使用的是 macOS 10.15 beta 3 和 iOS 13 beta 3。不确定是否与 beta 版有关 ios13 阻止 GET 请求有正文。如果您的后端允许,请使用 POST 方法 但它与 live ios13 完美配合,当您使用 xcode 11 ios 13 开发时会出现问题。 @MoinShirazi 只有在使用 iOS 13+ sdk 编译时才会出现该问题 【参考方案1】:

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

【讨论】:

谢谢,在您讨论的 Slack 社区中,我遇到了同样的问题。我还在 iOS 13 中使用 FileManager 面临另一个问题。 ***.com/questions/58081267/… 我的请求是使用方法 GET 并发送数据:,但不起作用;避免发送对象,它起作用了,谢谢!!【参考方案2】:

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

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

【讨论】:

它有帮助。但为什么?请解释 感谢这对我有用。【参考方案3】:

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

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

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

【讨论】:

那么你将如何传递参数呢?【参考方案4】:

我遇到了同样的问题,并找出解决方案。

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

如果 API 支持,则使用 POST 方法,或者在 URL 中传递,如下所示。

AnyURL?Parameter=Value&Parameter=Value

【讨论】:

直截了当...拯救我的一天:)【参考方案5】:

对于GET API 请求,请避免使用httpBody

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

一切都像魅力一样发挥作用。

【讨论】:

【参考方案6】:

我使用默认的 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)
    


【讨论】:

【参考方案7】:

我遇到了这个问题,因为我在发送 get 请求时在 Alamofire 中传递了空参数。因此,我没有发送空参数,而是将其替换为 nil。

【讨论】:

【参考方案8】:

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

self.request.parameters = nil

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

在这里,您可能缺少传递给数据任务的 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.

【讨论】:

以上是关于-1103 错误域=NSURLErrorDomain 代码=-1103“资源超出最大大小”iOS 13的主要内容,如果未能解决你的问题,请参考以下文章

(错误域=NSPOSIXErrorDomain 代码=100“协议错误”

跨域错误是怎么回事

电脑加域失败显示:5

错误:错误域=NSURLErrorDomain 代码=-1001“请求超时。”

需要在 Glassfish 上启动域,出现错误:“目录”中没有域

同一域上的ajax跨域错误?