1

ユーザーのデバイスがインターネットに接続されているかどうかを確認する関数を書いています。そうでない場合は、アラート ボックスでユーザーに警告します。

最初は、完全に機能する以下を使用していました。

var data = try NSURLConnection.sendSynchronousRequest(request, returningResponse: &response) as NSData?

しかし、これは iOS 9 で廃止されました。

そこで、コードを次のように変更しました。

import Foundation
import SystemConfiguration

public class Reachability {

class func isConnectedToNetwork()->Bool{

    var Status:Bool = false
    let url = NSURL(string: "https://google.com/")
    var response: NSURLResponse?
    let request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "HEAD"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.timeoutInterval = 10.0

    let sessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
    let session = NSURLSession(configuration: sessionConfig, delegate: nil, delegateQueue: nil)

    let task = session.dataTaskWithRequest(request, completionHandler: {data, response, err -> Void in

        if let httpResponse = response as? NSHTTPURLResponse {
            if httpResponse.statusCode == 200 {
                Status = true
            }
        } 
    })

    task.resume()
    return Status
}}

問題は、明らかに間違っているインターネット接続がないと常に言うことです。つまり、「Bool」は常に false です。私は何を間違っていますか?

前もって感謝します。

4

2 に答える 2

3

到達可能性またはその他のテストを使用することは、実際の要件を満たす方法です。

ただし、質問に答えるために、これが常に返される理由falseは、データタスクが非同期であるためです。つまり、関数呼び出しとは無関係に完了するため、完了してステータスをに設定しようとするまでtrueに、関数はすでに返されていますfalse

于 2015-09-28T07:58:54.670 に答える
2

推奨される方法は、実際に送信したいリクエストを送信し、それが成功したか失敗したかを判断し、失敗した場合は失敗した理由を判断することです。接続があるかどうかを確実に検出する方法はありません。

于 2015-09-28T07:51:11.340 に答える