Ios 请求未发送

Ios 请求未发送,ios,swift,ios8,nsurlconnection,Ios,Swift,Ios8,Nsurlconnection,当我从应用程序中使用API时,我遇到了一个奇怪的问题。有时,由于没有任何原因,请求没有发送,并且在超时结束时失败,出现以下错误: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." 我尝试过许多API,例如NSURLConnection委托、nsursession和NSURLConnection.sendSynchronousRequest,但都没有成功 下面是我为突出这个问题而做的一个示例项目 以下是复制的步骤:

当我从应用程序中使用API时,我遇到了一个奇怪的问题。有时,由于没有任何原因,请求没有发送,并且在超时结束时失败,出现以下错误:

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."
我尝试过许多API,例如
NSURLConnection
委托、
nsursession
NSURLConnection.sendSynchronousRequest
,但都没有成功

下面是我为突出这个问题而做的一个示例项目

以下是复制的步骤:

  • 在Xcode中运行应用程序并停止调试,使应用程序在您的手机上
  • 打开应用程序,单击测试连接(成功,加载轮立即停止旋转)
  • 转到其他应用程序,如facebook/twitter/网络游戏(有些有点重),并切换到飞行模式几次
  • 返回到我的应用程序并单击测试连接(加载轮永不停止)
一些可能有帮助的细节:

  • 如果我使用我的服务器IP而不是我的域名,它会成功

  • 问题仅在LTE/4G网络上出现

任何想法或解决方法都将不胜感激!请随意询问更多细节

谢谢

编辑


自从我第一次发布描述以来,我已经对其进行了大量编辑(希望使其更加清晰),如果一些答案或评论不再有意义,我很抱歉。

请尝试以下连接代码。这将对您有所帮助

      let urlData = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: &error)

            if error != nil || urlData!.length == 0
            {
                println("Error happend timeout======\(error?.code)!")

                continue
            }
            else //else1
            {if let httpResponse = response as? NSHTTPURLResponse
                {
                    println("Status Code for successful---\(httpResponse.statusCode)")

                    // For example 502 is for Bad Gateway
                    if (httpResponse.statusCode == 502)
                    {
                        // Check the response code from your server and break
                        break
                    }
                    else
                    {

                        //Your code
                     }
            }
    }
您可以在以下链接中获得HTTPS状态代码列表
我在使用异步请求时遇到了这个问题。似乎iOS限制了单个域的打开连接数,因此所有后续连接都会以您描述的方式失败

如果连接通常很快完成,这可能不会成为问题

解决方案是限制同一域的打开连接数,以防止发生这种情况


karlos发布的答案之所以有效,是因为连接的同步性会阻止其他连接被打开。

在您的代码中,您的请求获取默认超时为60秒,但您可以在代码中更改请求超时,如下所示

在您的
网络项目中
类更改超时

init(request:NSMutableURLRequest){
    self.request = request
    self.request.timeoutInterval = 120
    super.init()
}

正如在评论中提到的,我在我的托管服务上启用了DNSSEC(缓存中毒保护)

禁用它,修复了问题,尽管这可能不是一个很好的解决方案。经过几周的搜索,这就足够了


我会把赏金给能解释它的人,或者能提供更好的解决方案的人。

如果你使用NSURLSession API,问题会重现吗?@LeoNatan,是的,我对
NSURLSession
也有同样的问题,你在服务器端看到了什么?您是否看到服务器接受客户端连接,或者甚至没有到达服务器?我想说的是,在服务器的某个地方,您正在断开连接。也许是防火墙。@LeoNatan,我相信它不会到达服务器,日志中没有任何内容。(鉴于我可以看到客户是否被拒绝)。正如我在帖子中提到的,如果我锁定了设备,请求会在我解锁后立即发送。你在一个Web服务器上有没有在另一个Web服务器上没有的安全措施?谢谢你的回答,我不确定你发布此代码的原因,不幸的是,我也有同样的问题。我在LTE/4G连接上尝试了ConnectionBugApp,它在“”和“”URL上运行良好。我收到了“”Url的错误503。嗯,在其他应用程序上频繁使用网络后,您有没有尝试过?你也可以在几个小时内忘记该应用程序,稍后再点击“尝试连接”按钮;和“meetsam.co/”以及“ip.jsontest.com/”的错误503。谢谢您的回答,karlos的建议不起作用。如果我还可以添加,我在每个响应中都有一个
连接:close
标题,我相信这是因为我使用了其他应用程序使请求无法执行。比如,如果操作系统将我的应用程序及其连接放在后台,而忘记唤醒它。你是否尝试为https请求添加超时?你是说当我初始化请求时?是的,它有120秒的超时。只需将其减少到10秒,然后尝试打印响应。通常在应用程序中,超时时间约为60秒。@karlos是的,我增加了超时时间以查看发生了什么,起初是30秒,结果是一样的。谢谢你的回答,但这不是超时时间的问题。当它失败时,无论持续时间如何,它总是在超时结束时失败。“DNSSEC数据包可能会被拒绝,因为响应大小太大。”检查链接这可能是一个原因。