2017-05-24 1 views
0

URLSession Timout Interval을 설정하여 5 초가되도록 설정하려고합니다. 웹 페이지는 로컬 페이지이므로 해당 시간에로드해야합니다. 5 초 안에 웹 페이지가로드되지 않으면 팝업 메시지가 나타나고 사용자에게 네트워크에 연결하라는 메시지가 표시됩니다. 내 질문은, 내가 이미 가지고있는 작업 코드로 이것을 어떻게 구현할 수 있는가하는 것입니다. 몇 가지 다른 예제를 사용하려고 시도했지만 (하나는 주석으로 처리되었습니다) 운은 없습니다. 어떤 도움에 감사드립니다 :) 사람이 내가 모든 귀 해요 더 나은 솔루션이있는 경우 URLSession 시간 초과 간격 설정

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 웹 서버가 ssid와 psk를 변경하고있는 장치에서 실행 중입니다. 따라서 사용자가 올바른 네트워크 상에 있지 않으면 내 경보를 받기를 원합니다. 문제는 ssid가 정적이 아니므로 특정 문자열 값에 연결되어 있는지 확인할 수 없습니다. 그래서 내가 기본 세션 시간 초과 간격을 낮추고 (몇 초 후) 그들이 PHP 웹 페이지에 도달 할 수 있는지 확인하여 네트워크에 있는지 알려주고 싶습니다.

+0

이것은 당신이 올바른 생각이 .. https://stackoverflow.com/questions/23428793/nsurlsession-how-to-increase-time-out-for-url-requests – HowsThatMonkey

+0

찾고있는 수 그러나 나는 이것을 성공적으로 구현할 수 없었다. 위의 주석 된 코드는 링크가 제안한대로 동일합니다 (저는 믿습니다). –

답변

0

세 가지 생각 :

  • 당신은 사용자가 코어 재단에서 CNCopyCurrentNetworkInfo 기능을 사용하여 올바른 Wi-Fi 네트워크에 있는지 확인할 수 있습니다. 사용자가 잘못된 네트워크에있는 경우 요청이 실패 할 때까지 기다릴 필요가 없습니다.
  • 셀룰러 네트워킹으로 인해 (아마도 연결이 끊어진) Wi-Fi 네트워크로 전송되어야하는 요청을 인계 받았다고 가정합니다. 요청 또는 세션 수준에서 셀룰러 네트워킹을 비활성화 해보십시오. 많은 일이 마술처럼 작동하기 시작합니다.
  • 네트워크 요청 시간 초과 (네트워크가 사기성이있는 경우에도 계속 성공할 수있는 연결을 종료 함) 대신 일반 타이머 (NSTimer)를 사용하여 "네트워크 연결 오류 "(사용자가 해당 표시기와 상호 작용하지 않아도 됨). 네트워크가 될 수 있기 때문에, 네트워크가 사용자의 경우

(다중 경로 간섭, 전자 레인지 등에서 높은 패킷 손실) 어떤 이유로 단지 느린 경우 뭔가 오류의 원인이없이 잘못 될 수있는 사용자를 알려줍니다 변경하는 경우 주기적으로 추가 네트워크 요청을 첫 번째 요청과 병렬로 시작해야하며 두 개 또는 세 개가 실행 된 후에 원래 요청을 취소해야합니다. CNCopyCurrentNetworkInfo 또는 더 나은 아직 도달 가능성을 사용하여 네트워크 변경시기를 결정하고 네트워크에 가입 할 때까지 첫 번째 요청을 예약 할 때까지 기다릴 수 있습니다.

+0

CNCopyCurrentNetworkInfo는 깔끔한 트릭이지만 네트워크 ID가 정적이 아니기 때문에이 상황에서는 작동하지 않는다고 생각합니다. (실제로이 ap의 한 기능으로 ssid와 psk를 변경합니다.) 내가 무엇을 더하려고 하는지를 설명 할 수 있는지 알아 보도록하겠습니다. –

+0

그 경우 위의 세 번째 방법을 제안 할 것입니다. "라우터에 연결할 수 없습니다. 올바른 네트워크에 있습니까? (아직 시도 중입니다.") 일반 NSTimer를 사용하여 트리거하고 성공하거나 실패하거나 사용자가 취소 할 때까지 네트워크 요청을 그대로 둡니다. . 선택적으로 해당 타이머를 사용하는 지수 적 백 오프와 함께 병렬 요청을 * 추가 ​​* 시작하십시오. – dgatwood

+0

BTW, SSID를 설정하는 경우 예상되는 SSID를 알지 못하는 이유는 무엇입니까? 이전 SSID 또는 설정중인 새 SSID 중 하나 여야합니까? – dgatwood