1. ホーム
  2. ios

[解決済み] iOSまたはmacOSで、インターネット接続が有効かどうかを確認するにはどうすればよいですか?

2022-03-16 10:56:41

質問

iOSでインターネットに接続しているかどうか確認するために Cocoa Touch ライブラリ、またはmacOSでは ココア のライブラリーを使用します。

を使う方法を思いつきました。 NSURL . Googleが応答しない場合、他のウェブサイトからの応答を確認することができますが、それは無駄であり、私のアプリケーションに不必要なオーバーヘッドであると思われます。

- (BOOL) connectedToInternet
{
    NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
    return ( URLString != NULL ) ? YES : NO;
}

私がしてきたことは悪いことなのか、(言うまでもないことですが stringWithContentsOfURL iOS 3.0とmacOS 10.4では非推奨)また、もしそうなら、これを達成するためのより良い方法は何でしょうか?

どのように解決するのですか?

重要 : このチェックは 常に は非同期で実行されます。以下の回答の大半は同期なので、そうでない場合はアプリがフリーズしてしまうので注意してください。


スウィフト

  1. CocoaPodsまたはCarthage経由でインストールします。 https://github.com/ashleymills/Reachability.swift

  2. クロージャによる到達性テスト

    let reachability = Reachability()!
    
    reachability.whenReachable = { reachability in
        if reachability.connection == .wifi {
            print("Reachable via WiFi")
        } else {
            print("Reachable via Cellular")
        }
    }
    
    reachability.whenUnreachable = { _ in
        print("Not reachable")
    }
    
    do {
        try reachability.startNotifier()
    } catch {
        print("Unable to start notifier")
    }
    
    

オブジェクティブC

  1. 追加 SystemConfiguration フレームワークをプロジェクトに組み込みますが、どこに組み込むかは気にしないでください。

  2. Tony Millionのバージョンに Reachability.hReachability.m をプロジェクトに追加します(ここにあります。 https://github.com/tonymillion/Reachability )

  3. インターフェイスセクションの更新

    #import "Reachability.h"
    
    // Add this to the interface in the .m file of your view controller
    @interface MyViewController ()
    {
        Reachability *internetReachableFoo;
    }
    @end
    
    
  4. そして、このメソッドをビューコントローラの .m ファイルに実装し、以下のように呼び出します。

    // Checks if we have an internet connection or not
    - (void)testInternetConnection
    {
        internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"];
    
        // Internet is reachable
        internetReachableFoo.reachableBlock = ^(Reachability*reach)
        {
            // Update the UI on the main thread
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"Yayyy, we have the interwebs!");
            });
        };
    
        // Internet is not reachable
        internetReachableFoo.unreachableBlock = ^(Reachability*reach)
        {
            // Update the UI on the main thread
            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"Someone broke the internet :(");
            });
        };
    
        [internetReachableFoo startNotifier];
    }
    
    

重要なお知らせです。 Reachability クラスはプロジェクトで最もよく使われるクラスのひとつなので、他のプロジェクトと名前の衝突が発生する可能性があります。 このような場合は、ペアになった Reachability.hReachability.m ファイルを他のものに変更すると解決します。

注意 使用するドメインは関係ありません。任意のドメインへのゲートウェイをテストしているだけです。