iOSまたはmacOSでアクティブなインターネット接続を確認するにはどうすればよいですか?


1326

Cocoa Touchライブラリを使用するiOS またはCocoaライブラリを使用する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で非推奨になっています)。


11
むしろreturn (BOOL)URLString;、またはそれ以上、return !!URLStringまたはreturn URLString != nil

3
私はあなたのユースケースが何であるかわかりませんが、できればリクエストを試し、発生した接続の欠如などのエラーを処理することが望ましいです。これができない場合は、この場合、ここに良いアドバイスがたくさんあります。
SK9 2013

2
あなたの解決策は賢いです、そして私はそれを好みます。NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil];迷惑な警告を取り除くためにも使用でき ます。
Abdelrahman Eid 2013

4
以下のリンクからReachabilityクラスを使用してみてください 。github.com
tonymillion /

4
最近この答えを見つけた人のために:stackoverflow.com/a/8813279
afollestad 2014

回答:


1285

重要:このチェックは常に非同期で実行する必要あります。以下の答えの大部分は同期しているため、そうしないとアプリがフリーズすることに注意してください。


迅速

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")
}

Objective-C

1)SystemConfigurationフレームワークをプロジェクトに追加しますが、どこに含めてもかまいません。

2)のトニー・ミリオンのバージョンを追加Reachability.hし、Reachability.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あなたが他のプロジェクトとの競合に名前を付けるに遭遇するかもしれないので、クラスがプロジェクトに最も使用されるクラスの1つです。これが発生した場合は、Reachability.hReachability.mファイルのペアの1つを別の名前に変更して、問題を解決する必要があります。

注:使用するドメインは重要ではありません。これは、任意のドメインへのゲートウェイをテストするだけです。


4
@gonzobrains:使用するドメインは関係ありません。これは、任意のドメインへのゲートウェイをテストするだけです。
iwasrobbed

3
@KaanDedeogluこれは単なる例であり、任意のドメインを使用します。ドメインが実際に利用可能であるかどうかではなく、インターネットへのゲートウェイをチェックするだけです。
iwasrobbed、2013年

1
ああ、ところでSystemConfiguration.framework、プロジェクトにも追加する必要があります(方法1の場合)。
wiseindy 2013

2
google.comの代わりにwww.appleiphonecell.comを使用してください-このURLは、まさにこの理由のためにAppleによって作成されました。
Smikey

1
www.appleiphonecell.comの使用は今(2018年)は悪い選択です。これで、40kBを超えるHTMLファイルであるApple.comにリダイレクトされます。google.comに戻ります-わずか11kBです。BTW google.com/mは同じサイズですが、120ミリ秒遅いと報告されています。
BlueskyMed

311

私は物事をシンプルに保つのが好きです。これを行う方法は次のとおりです。

//Class.h
#import "Reachability.h"
#import <SystemConfiguration/SystemConfiguration.h>

- (BOOL)connected;

//Class.m
- (BOOL)connected
{
    Reachability *reachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [reachability currentReachabilityStatus];
    return networkStatus != NotReachable;
}

次に、接続があるかどうかを確認したいときにこれを使用します。

if (![self connected]) {
    // Not connected
} else {
    // Connected. Do some Internet stuff
}

このメソッドは、何かを行うためにネットワークステータスの変更を待機しません。要求したときにステータスをテストするだけです。


こんにちは@msec、このページでAndrew Zimmerソリューションを試すことができます。adslが切断されている(およびwifiが接続されている)場合は問題なく機能します
Williew

1
上記のコードで行ったようにコピーして貼り付けるだけの人のために。また、手動でSystemConfiguration.frameworkを追加すると、リンクエラーが発生します。
Iftikhar Ali Ansari 2015

WiFiで接続する場合は、常に到達可能になるようにします。WiFiは、インターネットに接続しているという意味ではありません。WiFi接続があっても、インターネット接続を確認したい。手伝ってくれませんか?
wesley

@wesleyどうやって解決したの?
Keselme

146

Appleの到達可能性コードを使用して、クラスを含めることなくこれを正しくチェックする関数を作成しました。

プロジェクトにSystemConfiguration.frameworkを含めます。

インポートします。

#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>

次に、この関数を呼び出すだけです。

/*
Connectivity testing code pulled from Apple's Reachability Example: https://developer.apple.com/library/content/samplecode/Reachability
 */
+(BOOL)hasConnectivity {
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&zeroAddress);
    if (reachability != NULL) {
        //NetworkStatus retVal = NotReachable;
        SCNetworkReachabilityFlags flags;
        if (SCNetworkReachabilityGetFlags(reachability, &flags)) {
            if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
            {
                // If target host is not reachable
                return NO;
            }

            if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
            {
                // If target host is reachable and no connection is required
                //  then we'll assume (for now) that your on Wi-Fi
                return YES;
            }


            if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
                 (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
            {
                // ... and the connection is on-demand (or on-traffic) if the
                //     calling application is using the CFSocketStream or higher APIs.

                if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
                {
                    // ... and no [user] intervention is needed
                    return YES;
                }
            }

            if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
            {
                // ... but WWAN connections are OK if the calling application
                //     is using the CFNetwork (CFSocketStream?) APIs.
                return YES;
            }
        }
    }

    return NO;
}

そして、それはあなたのためにテストされたiOS 5です。


@JezenThomasこれは非同期でインターネットチェックを実行しないため、「非常にスリム」な理由です...このプロセスでアプリをハングアップしないように、通知をサブスクライブすることにより、常に非同期で実行する必要があります。
2012年

ありがとう、wifi adslを使用していて、adslが接続されていない場合でも、この作業はまさに私が必要とするものです。
Williew

5
これによりメモリがリークします-「可読性」の構造(オブジェクト、モノ)はCFRelease()で解放する必要があります。
ラッセルマル

@RussellMull ...リークを修正する方法はありますか?
i_raqz 2013

この回答が(重複としてマークされた質問で)私よりも2年前に出るのは奇妙なことですが、私とまったく同じですが、今日まで見たことはありません。
ArtOfWarfare 2014年

122

以前は正しい答えでしたが、代わりに到達可能性の通知をサブスクライブする必要があるため、現在は古くなっています。このメソッドは同期的にチェックします:


AppleのReachabilityクラスを使用できます。また、Wi-Fiが有効になっているかどうかも確認できます。

Reachability* reachability = [Reachability sharedReachability];
[reachability setHostName:@"www.example.com"];    // Set your host name here
NetworkStatus remoteHostStatus = [reachability remoteHostStatus];

if (remoteHostStatus == NotReachable) { }
else if (remoteHostStatus == ReachableViaWiFiNetwork) { }
else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { }

ReachabilityクラスはSDKには付属していませんが、このAppleサンプルアプリケーションの一部です。ダウンロードして、Reachability.h / mをプロジェクトにコピーします。また、SystemConfigurationフレームワークをプロジェクトに追加する必要があります。


6
そのようなReachabilityを使用しないことについては、上記の私のコメントを参照してください。非同期モードで使用し、送信する通知をサブスクライブします-しないでください。
Kendall Helmstetter Gelner、

このコードは、到達可能性クラスのデリゲートメソッドを使用する前に設定する必要があるものの良い出発点です。
Brock Woolf、

82

ここに非常に簡単な答えがあります:

NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data)
    NSLog(@"Device is connected to the Internet");
else
    NSLog(@"Device is not connected to the Internet");

URLは非常に小さなWebサイトを指す必要があります。ここではGoogleのモバイルWebサイトを使用していますが、信頼性の高いWebサーバーがある場合は、最大の速度で1文字だけの小さなファイルをアップロードします

デバイスがなんらかの方法でインターネットに接続されているかどうかを確認することだけが目的の場合は、この簡単なソリューションを使用することをお勧めします。ユーザーの接続方法を知る必要がある場合は、到達可能性を使用する方法があります。

注意:これにより、ウェブサイトの読み込み中にスレッドが一時的にブロックされます。私の場合、これは問題ではありませんでしたが、これを考慮する必要があります(これを指摘してくれたBradへのクレジット)。


10
私はこのアイデアが本当に好きですが、小さい応答サイズを維持しながら99.999%の信頼性を実現するには、googleのモバイルビューであるwww.google.com/mを使用します。
rwyland 2012

1
素晴らしいソリューション@Erik。また、rwylandが言ったように、www.google.com / mの代わりにwww.google.comを使用することをお勧めします。奇妙ですが、私のテストでは、モバイル版は常にwww.google.comよりも約120ミリ秒かかります
Sebyddd

4
Appleのドキュメントでは、遅いネットワークでスレッドをブロックし、アプリがiOSで終了する可能性があるため、これを行わないことを推奨しています
Brad Thomas

肯定的なフィードバックをありがとう、www.google.com / mが信頼性のために最善のソリューションであることに同意してください!
エリック

3
爆笑、私は人々がインターネットチェックのリソースとしてそれらを使用することを提案することをGoogleが感謝していると確信しています。
mxcl 2018

73

アプリでの方法は次のとおりです。200ステータスレスポンスコードは何も保証しませんが、十分に安定しています。私がHEADレスポンスをチェックするだけなので、これはここに投稿されたNSDataの回答ほど多くのロードを必要としません。

スウィフトコード

func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let url = NSURL(string: "http://www.google.com/")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "HEAD"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.timeoutInterval = 10.0

    NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler:
    {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        UIApplication.sharedApplication().networkActivityIndicatorVisible = false

        let rsp = response as! NSHTTPURLResponse?

        completionHandler(internet:rsp?.statusCode == 200)
    })
}

func yourMethod()
{
    self.checkInternet(false, completionHandler:
    {(internet:Bool) -> Void in

        if (internet)
        {
            // "Internet" aka Google URL reachable
        }
        else
        {
            // No "Internet" aka Google URL un-reachable
        }
    })
}

Objective-Cコード

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.google.com/"];
    NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
    headRequest.HTTPMethod = @"HEAD";

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    defaultConfigObject.timeoutIntervalForResource = 10.0;
    defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;

    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        if (!error && response)
        {
            block([(NSHTTPURLResponse *)response statusCode] == 200);
        }
    }];
    [dataTask resume];
}

- (void)yourMethod
{
    [self checkInternet:^(BOOL internet)
    {
         if (internet)
         {
             // "Internet" aka Google URL reachable
         }
         else
         {
             // No "Internet" aka Google URL un-reachable
         }
    }];
}

3
これが最速の方法のようです
Pavel

3
注意:私の経験では、このソリューションは常に機能するとは限りません。多くの場合、返された応答は、その甘い時間を取った後、403です。このソリューションは完璧に見えましたが、100%の結果を保証するものではありません。
Mustafa 2013年

10
2014年6月の時点で、中国政府はgoogle.comを完全にブロックしているため、中国本土では失敗します。(ただし、google.cnは機能しますが、中国本土ではbaidu.comもインターネットも使用できません)通信に必要なすべてのサーバーに対してpingを実行することをお勧めします。
2014

4
代わりにwww.appleiphonecell.comを使用してください-アップルはこの理由でこのURLを作成しました。
Smikey

1
私はappleiphonecellを使用しました。これはApple独自のものであり、中国でも使用でき、非常に高速なWebサイトです。これは、あなたの回答と併せて、最も近くて最速のソリューションを提供してくれました。ありがとう
Septronic、2015年

57

Appleは、さまざまな種類のネットワークの可用性を確認するためのサンプルコードを提供しています。あるいは、iPhone開発者のクックブックにがあります。

注: Appleの到達可能性コードの使用については、この回答に関する@KHGのコメントを参照してください。


ありがとう。3.0のXcodeドキュメントにもソースコードが含まれていることがわかりました。ドキュメントで「到達可能性」を検索すると見つかりました。
Brock Woolf、

7
AppleのReachabilityサンプルコードの新しいリビジョン(09-08-09)は非同期であることに注意してください。
Daniel Hepper、2010年

46

Reachabilitybyで使用できます(ここから入手できます)。

#import "Reachability.h"

- (BOOL)networkConnection {
    return [[Reachability reachabilityWithHostName:@"www.google.com"] currentReachabilityStatus];
}

if ([self networkConnection] == NotReachable) { /* No Network */ } else { /* Network */ } //Use ReachableViaWiFi / ReachableViaWWAN to get the type of connection.

@Supertecnoboffいいえ、非同期です。
Aleksander Azizi

39

Appleはこれを正確に行うサンプルアプリを提供しています。

到達可能性


7
Reachabilityサンプルでは、​​アクティブなインターフェースのみが検出され、インターネットへの有効な接続があるインターフェースは検出されないことに注意してください。Reachabilityがすべての準備ができていると報告した場合でも、アプリケーションは障害を適切に処理する必要があります。
rpetrich 2009

幸いにも、状況は3.0ではるかに良くなりました。システムは、使用するためにログインする必要があるロックダウンされたWiFiの背後にあるユーザーにログインページを表示します...リダイレクトを手動で確認する必要があります(それでもまだ2.2.1アプリを開発している場合)
Kendall Helmstetter Gelner、

Reachabilityアプリが求められていることを正確に実行するとは言いません。ただし、要求される種類の機能を追加するための良い出発点です
Johan Karlsson

リンク切れ!、これを確認/修正できるとありがたいです。ありがとう
ハイダーサティ

33

Reachabilityクラスのみが更新されました。あなたは今使うことができます:

Reachability* reachability = [Reachability reachabilityWithHostName:@"www.apple.com"];
NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus];

if (remoteHostStatus == NotReachable) { NSLog(@"not reachable");}
else if (remoteHostStatus == ReachableViaWWAN) { NSLog(@"reachable via wwan");}
else if (remoteHostStatus == ReachableViaWiFi) { NSLog(@"reachable via wifi");}

1
4.0がリリースされてから何かが変更されない限り、そのコードは非同期ではなく、クラッシュレポートに表示されることが保証されます。
bpapa 2010

1
私はbpapaに同意します。同期コードを使用することはお勧めできません。情報ありがとうございました
Brock Woolf



22

使用しているAFNetworking場合は、インターネットの到達可能性ステータスに独自の実装を使用できます。

使用する最良の方法AFNetworkingは、AFHTTPClientクラスをサブクラス化し、このクラスを使用してネットワーク接続を行うことです。

このアプローチを使用する利点の1つは、blocks到達可能性のステータスが変化したときに、を使用して目的の動作を設定できることです。という名前のシングルトンサブクラスAFHTTPClientAFNetworkingのドキュメントの「サブクラス化に関するメモ」で述べたBKHTTPClientように)を作成したとすると、次のようになります。

BKHTTPClient *httpClient = [BKHTTPClient sharedClient];
[httpClient setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status)
{
    if (status == AFNetworkReachabilityStatusNotReachable) 
    {
    // Not reachable
    }
    else
    {
        // Reachable
    }
}];

また、具体的使用のWi-FiまたはWLAN接続のためにチェックすることができAFNetworkReachabilityStatusReachableViaWWAN、およびAFNetworkReachabilityStatusReachableViaWiFi(列挙型よりここに)。


18

このディスカッションではコードを使用しましたが、正常に動作するようです(スレッド全体を読んでください)。

私は、考えられるすべての種類の接続(アドホックWi-Fiなど)を使って徹底的にテストしていません。


このコードは、Webにアクセスできるかどうかではなく、ルーターとのwifi接続があるかどうかを確認するだけなので、完全に適切ではありません。Wi-Fiを有効にして、Webにアクセスできるようにすることができます。
ダックダッキング

15

非常に簡単です。次の手順を試してください。

ステップ1:SystemConfigurationフレームワークをプロジェクトに追加します。


ステップ2:次のコードをheaderファイルにインポートします。

#import <SystemConfiguration/SystemConfiguration.h>

手順3:次の方法を使用する

  • タイプ1:

    - (BOOL) currentNetworkStatus {
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        BOOL connected;
        BOOL isConnected;
        const char *host = "www.apple.com";
        SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
        SCNetworkReachabilityFlags flags;
        connected = SCNetworkReachabilityGetFlags(reachability, &flags);
        isConnected = NO;
        isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
        CFRelease(reachability);
        return isConnected;
    }

  • タイプ2:

    インポートヘッダー#import "Reachability.h"

    - (BOOL)currentNetworkStatus
    {
        Reachability *reachability = [Reachability reachabilityForInternetConnection];
        NetworkStatus networkStatus = [reachability currentReachabilityStatus];
        return networkStatus != NotReachable;
    }

ステップ4:使用方法:

- (void)CheckInternet
{
    BOOL network = [self currentNetworkStatus];
    if (network)
    {
        NSLog(@"Network Available");
    }
    else
    {
        NSLog(@"No Network Available");
    }
}

タイプ1は非同期ですか?
Supertecnoboff

私はあなたの答えからタイプ2の修正を求めています。到達可能性クラスを追加し、上記の回答を使用して接続検証を確認しようとしました。WiFiで接続しても常に到達可能になりますが、インターネット接続がありません。WiFiは、インターネットに接続しているという意味ではありません。WiFi接続があっても、インターネット接続を確認したい。手伝ってくれませんか?
wesley

12
-(void)newtworkType {

 NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
        dataNetworkItemView = subview;
        break;
    }
}


switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
    case 0:
        NSLog(@"No wifi or cellular");
        break;

    case 1:
        NSLog(@"2G");
        break;

    case 2:
        NSLog(@"3G");
        break;

    case 3:
        NSLog(@"4G");
        break;

    case 4:
        NSLog(@"LTE");
        break;

    case 5:
        NSLog(@"Wifi");
        break;


    default:
        break;
}
}

7
デバイスがWifiまたはその他のネットワークタイプに接続されている場合でも、インターネット接続が利用できない場合があります。簡単なテスト:自宅のwifiに接続してから、ケーブルモデムを取り外します。まだwifiに接続していますが、インターネットはありません。
iwasrobbed、2013

11
- (void)viewWillAppear:(BOOL)animated
{
    NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

    return (URL != NULL ) ? YES : NO;
}

または、到達可能性クラスを使用します。

iPhone SDKを使用してインターネットの可用性を確認するには、2つの方法があります。

1. Googleページが開いているかどうかを確認します。

2.到達可能性クラス

詳細については、到達可能性(Apple Developer)を参照してください。


1
iPhone SDKでインターネットの可用性を確認するには2つの方法があります1)Googleページが開いているかどうかを確認します。
IOS Rocks

1
-1:これは、google.comに接続しようとしている間、メインスレッド(アプリのUIが変更されるスレッド)をブロックする同期メソッドです。ユーザーのデータ接続が非常に遅い場合、電話はプロセスが応答しないように動作します。
iwasrobbed 2013年


10

最初CFNetwork.frameworkフレームワークに追加

コードViewController.m

#import "Reachability.h"

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}

8

まず、到達可能性クラスをダウンロードし、Xcodeに reachability.hファイルとreachabilty.mファイルを配置します。

最善の方法は、共通の関数クラス(NSObject)を作成して、どのクラスでも使用できるようにすることです。これらは、ネットワーク接続の到達可能性チェックの2つの方法です。

+(BOOL) reachabiltyCheck
{
    NSLog(@"reachabiltyCheck");
    BOOL status =YES;
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(reachabilityChanged:)
                                          name:kReachabilityChangedNotification
                                          object:nil];
    Reachability * reach = [Reachability reachabilityForInternetConnection];
    NSLog(@"status : %d",[reach currentReachabilityStatus]);
    if([reach currentReachabilityStatus]==0)
    {
        status = NO;
        NSLog(@"network not connected");
    }
    reach.reachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    reach.unreachableBlock = ^(Reachability * reachability)
    {
        dispatch_async(dispatch_get_main_queue(), ^{
        });
    };
    [reach startNotifier];
    return status;
}

+(BOOL)reachabilityChanged:(NSNotification*)note
{
    BOOL status =YES;
    NSLog(@"reachabilityChanged");
    Reachability * reach = [note object];
    NetworkStatus netStatus = [reach currentReachabilityStatus];
    switch (netStatus)
    {
        case NotReachable:
            {
                status = NO;
                NSLog(@"Not Reachable");
            }
            break;

        default:
            {
                if (!isSyncingReportPulseFlag)
                {
                    status = YES;
                    isSyncingReportPulseFlag = TRUE;
                    [DatabaseHandler checkForFailedReportStatusAndReSync];
                }
            }
            break;
    }
    return status;
}

+ (BOOL) connectedToNetwork
{
    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
    if (!didRetrieveFlags)
    {
        NSLog(@"Error. Could not recover network reachability flags");
        return NO;
    }
    BOOL isReachable = flags & kSCNetworkFlagsReachable;
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
    NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL  cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
    NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
    return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
}

これで、このクラスメソッドを呼び出して、任意のクラスのネットワーク接続を確認できます。


8

iPhone SDKを使用してインターネット接続を確認する別の方法もあります。

ネットワーク接続用に次のコードを実装してみてください。

#import <SystemConfiguration/SystemConfiguration.h>
#include <netdb.h>

/**
     Checking for network availability. It returns
     YES if the network is available.
*/
+ (BOOL) connectedToNetwork
{

    // Create zero addy
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;

    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability =
        SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);

    if (!didRetrieveFlags)
    {
        printf("Error. Could not recover network reachability flags\n");
        return NO;
    }

    BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);

    return (isReachable && !needsConnection) ? YES : NO;
}


8
  1. 到達可能性ファイルhttps://gist.github.com/darkseed/1182373をダウンロードします

  2. CFNetwork.frameworkフレームワークに「SystemConfiguration.framework」を追加します

  3. #import "Reachability.h"を実行します


最初CFNetwork.frameworkフレームワークに追加

コードViewController.m

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}

8

Swift 3 / Swift 4

最初にインポートする必要があります

import SystemConfiguration

以下の方法でインターネット接続を確認できます

func isConnectedToNetwork() -> Bool {

    var zeroAddress = sockaddr_in()
    zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
    zeroAddress.sin_family = sa_family_t(AF_INET)

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
            SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
        }
    }

    var flags = SCNetworkReachabilityFlags()
    if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
        return false
    }
    let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
    let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
    return (isReachable && !needsConnection)

}

7

到達可能性クラスには、インターネット接続がデバイスに利用可能であるかどうかを調べるためにOKです...

ただし、イントラネットリソースにアクセスする場合:

到達可能性クラスでイントラネットサーバーにpingすると、常にtrueが返されます。

したがって、このシナリオでの簡単な解決策はpingme、サービスの他のWebメソッドと一緒に呼び出されるWebメソッドを作成することです。pingme何かを返す必要があります。

だから私は一般的な機能について次のメソッドを書きました

-(BOOL)PingServiceServer
{
    NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];

    NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];

    [urlReq setTimeoutInterval:10];

    NSURLResponse *response;

    NSError *error = nil;

    NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
                                                 returningResponse:&response
                                                             error:&error];
    NSLog(@"receivedData:%@",receivedData);

    if (receivedData !=nil)
    {
        return YES;
    }
    else
    {
        NSLog(@"Data is null");
        return NO;
    }
}

上記の方法は私にとってとても便利だったので、サーバーにデータを送信しようとするときはいつでも、この低タイムアウトURLRequestを使用してイントラネットリソースの到達可能性を常にチェックします。


7

これを自分で行うのは非常に簡単です。次の方法が機能します。HTTP、HTTPSなどのホスト名プロトコルが名前で渡されないようにしてください。

-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
    SCNetworkReachabilityFlags flags;
    if (!SCNetworkReachabilityGetFlags(ref, &flags))
    {
        return NO;
    }
    return flags & kSCNetworkReachabilityFlagsReachable;
}

それは迅速でシンプルで無痛です。



7

これが一番の答えだと思います。

「はい」は接続されていることを意味します。「いいえ」は切断されていることを意味します。

#import "Reachability.h"

 - (BOOL)canAccessInternet
{
    Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
    NetworkStatus internetStats = [IsReachable currentReachabilityStatus];

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}

6

Reachable.hクラスをインポートしViewController、次のコードを使用して接続を確認します

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }

あなたの答えはまさに私が探しているものです。あなたはxDに投票する価値があります
Nikel Arteta

インターネットなしでWiFiに接続している場合は機能しません。
Keselme

6
  • ステップ1:プロジェクトにReachabilityクラスを追加します。
  • ステップ2:到達可能性クラスをインポートする
  • ステップ3:以下の関数を作成する

    - (BOOL)checkNetConnection {
        self.internetReachability = [Reachability reachabilityForInternetConnection];
        [self.internetReachability startNotifier];
        NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus];
        switch (netStatus) {
            case NotReachable:
            {
                return NO;
            }
    
            case ReachableViaWWAN:
            {
                 return YES;
            }
    
            case ReachableViaWiFi:
            {
                 return YES;
            }
        }
    }
  • ステップ4:以下のように関数を呼び出します。

    if (![self checkNetConnection]) {
        [GlobalFunctions showAlert:@""
                         message:@"Please connect to the Internet!"
                         canBtntitle:nil
                         otherBtnTitle:@"Ok"];
        return;
    }
    else
    {
        Log.v("internet is connected","ok");
    }

Appleのドキュメントはこれを述べています:特定のホストに接続できるかどうか、到達可能性はアプリケーションに通知できません。接続を許可する可能性のあるインターフェースが利用可能であり、そのインターフェースがWWANであるかどうかのみです。
noobsmcgoobs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.