设置 URLSession 超时间隔

Posted

技术标签:

【中文标题】设置 URLSession 超时间隔【英文标题】:Set URLSession Timout Interval 【发布时间】:2017-05-24 05:58:05 【问题描述】:

我正在尝试将 URLSession 超时间隔设置为 5 秒。该网页是本地页面,因此应在该时间内加载。如果网页在 5 秒内未加载,我希望弹出一条警报消息并告诉用户连接到网络。我的问题是,如何使用我已经拥有的工作代码来实现它?我尝试使用几个不同的例子(一个被注释掉)但没有运气。任何帮助表示赞赏:)

func loadINFO()

    let urlString = "mytestphp.php"

    let url = URL(string: urlString)

    //Try To Set Timout Interval...
    //let urlconfig = URLSessionConfiguration.default
    //urlconfig.timeoutIntervalForRequest = 5
    //urlconfig.timeoutIntervalForResource = 5
    //let session = URLSession(configuration: urlconfig)


    URLSession.shared.dataTask(with:url!)  (data, response, error ) in
        if error != nil 

            //Alert User That They Are Not Connected To The Device
            self.CreateAlert(title: "Error!", message: "Please Connect To Network and Try Again")
            print(error as Any)

         else 


            do 
                let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any]
                if let ssid = parsedData["SSID"] as? String,
                    let pass = parsedData["PASS"] as? String 
                    DispatchQueue.main.async 
                        // Update UI
                        self.SSID_INPUT.text = (ssid)
                        self.PASS_INPUT.text = (pass)

                    

                
            

            catch let error as NSError 

                print(error)
            
        

    .resume()


仍然没有得到答案..如果有人有更好的解决方案,我会全力以赴。

编辑:只是为了进一步澄清。 php web 服务器正在我更改 ssid 和 psk 的设备上运行。因此,如果用户不在正确的网络上,我希望他们收到我的警报。问题是,ssid 不是静态的,所以我无法检查它们是否连接到特定的字符串值。这就是为什么我想看看我是否可以降低默认会话超时间隔,并通过查看他们是否可以访问 php 网页来告诉(几秒钟后)他们是否在网络上。

【问题讨论】:

这可能就是你要找的东西..***.com/questions/23428793/… 我相信你是对的,但是我无法成功实现这一点。上面注释的代码与该链接建议的代码相同(我相信)。 【参考方案1】:

三个想法:

您可以使用Core Foundation 中的CNCopyCurrentNetworkInfo 功能检查用户是否在正确的Wi-Fi 网络上。如果用户在错误的网络上,则无需等待请求失败。 我假设您遇到了由于蜂窝网络接管应发送到(可能已断开连接的)Wi-Fi 网络的请求而导致的停顿。尝试在请求或会话级别禁用蜂窝网络,很多事情可能会开始神奇地工作。 您应该使用普通计时器 (NSTimer) 来显示某种被动的 UI 指示器,而不是让网络请求超时(这会终止在网络不可靠的情况下仍可能成功的连接)。网络连接错误”(不强制用户与该指示器交互)。这会告诉用户,如果网络由于某种原因(多路径干扰、微波炉等造成的高丢包率)变慢,可能会出现问题而不会导致故障。

在您的情况下,由于网络可能会发生变化,您可能应该定期启动额外的网络请求与第一个并行请求,并在运行两个或三个以上的请求后取消原始请求。您还可以使用CNCopyCurrentNetworkInfo(或者更好的是可达性)来确定网络何时发生变化,并等待安排第一个请求,直到您加入网络。

【讨论】:

CNCopyCurrentNetworkInfo 是一个巧妙的技巧,但我不相信它会在这种情况下工作,因为网络 ID 不是静态的。 (这实际上是这个ap的一个功能,改变ssid和psk)。让我看看我是否可以进一步解释我想要做的事情.. 在这种情况下,我会建议上面的第三种方法。显示一些文本,如“无法到达路由器。你在正确的网络上吗?(仍在尝试。)”,并使用普通的 NSTimer 触发它,并让网络请求不理会,直到它成功、失败或用户取消它.或者,使用该计时器启动附加并行请求,并使用指数退避。 顺便说一句,如果您要设置 SSID,为什么不知道预期的 SSID?它应该是以前的 SSID 或您设置的新 SSID,不是吗? 我会按照您在第三点中的建议考虑使用 NSTimer。 SSID 在第一次启动时是随机的,所以我不知道默认的 SSID。不过,我也许可以解决这个问题。在用户更改 SSID 后,它将被知道,以便在第一次更改后可以工作。

以上是关于设置 URLSession 超时间隔的主要内容,如果未能解决你的问题,请参考以下文章

URLSession dataTaskPublisher 在特定错误延迟后重试

URLSession 配置的标头设置仅适用于 PUT,不适用于 POST

NTLM 的 URLSession 的 401 挑战

如何在 Swift 3 中使用带有代理的 URLSession

swift URLSessionの拡张(URLSession#synchronousDataTask,URLSession #retryDataTask)ref:http://qiita.com/to

Swift UrlSession 在 UrlSession 中不起作用