2017-05-24 44 views
0

URLSession Timout Intervalを5秒に設定しようとしています。 Webページはローカルページなので、その時間内にロードする必要があります。 Webページが5秒以内に読み込まれない場合は、警告メッセージをポップアップして、ネットワークに接続するようにユーザーに指示します。私の質問は、私はすでに持っている作業コードでこれを実装できますか?私はいくつかの異なる例を使用しようとしましたが(1つはコメントアウトされています)、運はありません。任意のヘルプは高く評価されています:)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 Webサーバーは、私がssidとpskを変更しているデバイスで実行されています。したがって、ユーザーが正しいネットワーク上にいない場合、私はアラートを受け取ることを望みます。問題は、ssidは静的ではないため、特定の文字列値に接続されているかどうかを確認できません。だから私は、デフォルトのセッションタイムアウト間隔を減らし、(もし数秒後に)彼らがネットワーク上にいるかどうかをPHP Webページに到達できるかどうかを見て伝えることを探していたのです。

+0

これはあなたが探しているものである可能性があります.. https://stackoverflow.com/questions/23428793/nsurlsession-how-to-increase-time-out-for-url-requests – HowsThatMonkey

+0

私はあなたが正しいと信じています私はこれをうまく実装できませんでした。上記のコメントされたコードは、そのリンクが示唆しているものと同じです(私は信じています)。 –

答えて

0

三の思考:

  • ユーザーがCore FoundationのでCNCopyCurrentNetworkInfo機能を使用して正しいのWi-Fiネットワーク上にあるかどうかを確認することができます。ユーザーが間違ったネットワークにいる場合、リクエストが失敗するのを待つ必要はありません。
  • 私は、(おそらく切断されている)Wi-Fiネットワークに送信する必要がある要求を引き継ぐセルラーネットワークによって屋台があると仮定しています。要求やセッションレベルで携帯ネットワークを無効にしてみてください。多くのことが魔法のように動作するようになるでしょう。
  • ネットワーク要求がタイムアウトになるのではなく(ネットワークが盗聴されても接続が終了する)、通常のタイマー(NSTimer)を使用して、「ネットワーク接続エラー "(ユーザーにそのインジケーターとのやりとりを強いることはありません)。これは、何らかの理由でネットワークが遅い(マルチパス干渉、電子レンジなどによるパケットロスが多い)場合に、何らかの障害が発生する可能性があることをユーザーに伝えます。

あなたの場合、おそらく、最初のものと並行して追加のネットワーク要求を定期的に開始し、2つまたは3つ以上が実行された後に元の要求を取り消すべきです。また、CNCopyCurrentNetworkInfoを使用することもできます。これは、ネットワークの変更時期を判断し、ネットワークに参加するまで最初のリクエストのスケジュールを待つことです。

+0

CNCopyCurrentNetworkInfoはきちんとしたトリックですが、ネットワークIDが静的でないため、この状況ではうまくいかないと思います。 (これは実際にはこのapの1つの関数であり、ssidとpskを変更するためです)。 –

+0

その場合、上記の3番目のアプローチをお勧めします。 「ルータに到達できません。正しいネットワークにいますか(まだ試していますか?」)、通常のNSTimerを使用してトリガーし、成功するか、失敗するか、ユーザーがキャンセルするまで、 。必要に応じて、そのタイマを使用して指数バックオフで並列リクエストを開始*追加*します。 – dgatwood

+0

ところで、あなたがSSIDを設定しているのであれば、予想されるSSIDを知っているのはなぜですか?以前のSSIDか新しいSSIDのどちらかでなければなりませんか? – dgatwood

関連する問題