2

The method below works very well for checking to see if a user has an internet connection. I would like to check for an internet connection throughout my entire app, and am wondering if there is somewhere I can put it within my App Delegate where it will get called from every view controller.

Is there a way to do this? Doesn't seem to work properly if I put it in my applicationDidFinishLaunching. Any recommendations would be great! Thank you!

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");
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No Internet Connectivity" 
    message:@"You must have an internet connection" delegate:self cancelButtonTitle:@"OK" 
    otherButtonTitles:nil, nil];
    [alert show];
    return;
}
4

3 に答える 3

4

アプリケーション全体からアクセスして呼び出すことができる場所にこの特定のメソッドを配置しようとしている場合、これは単なる設計上の決定です。これを達成する方法はいくつかあります。

グローバル メソッドを実装するときは、シングルトン パラダイムを利用するのが好きです。ジョン・ワーズワースは、こちらの簡潔なブログ投稿でこれをカバーしています。

http://www.johnwordsworth.com/2010/04/iphone-code-snippet-the-singleton-pattern/

コードの簡単なチャンクを次に示します。

InternetConnectionChecker.h

#import <Foundation/Foundation.h>

@interface InternetConnectionChecker : NSObject

// Accessor for singelton instance of internet connection checker.
+ (InternetConnectionChecker *)sharedInternetConnectionChecker;

// Check to see whether we have a connection to the internet. Returns YES or NO.
- (BOOL)connected;

@end

InternetConnectionChecker.m

#import "InternetConnectionChecker.h"

@implementation InternetConnectionChecker

// Accessor for singelton instance of internet connection checker.
+ (InternetConnectionChecker *)sharedInternetConnectionChecker
{
    static InternetConnectionChecker *sharedInternetConnectionChecker;
    @synchronized(self)
    {
        if (!sharedInternetConnectionChecker) {
            sharedInternetConnectionChecker = [[InternetConnectionChecker alloc] init];
        }
    }
    return sharedInternetConnectionChecker;
}

// Check to see whether we have a connection to the internet. Returns YES or NO.
- (BOOL)connected
{
    NSURL *scriptUrl = [NSURL URLWithString:@"http://www.google.com/m"];
    NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
    if (data) {
        NSLog(@"Device is connected to the internet");
        return TRUE;
    }
    else {
        NSLog(@"Device is not connected to the internet");
        return FALSE;
    }
}

@end

私の例では、true/false を返すようにメソッドを修正したので、UI 内でメソッドを適切に呼び出して結果を処理できますが、必要に応じて UIAlertView を表示し続けることもできます。

次に、シングルトンを次のように使用します。

InternetConnectionChecker *checker = [InternetConnectionChecker sharedInternetConnectionChecker];
BOOL connected = [checker connected];
于 2013-03-03T01:23:32.060 に答える
1

もちろん、もっと複雑な方法もありますが、最も簡単な方法 (および私が使用する方法) は、bool を返すクラス メソッドとしてメソッドを使用して "CheckNetwork" クラスを作成することです。つまり、次のようになります。

+ (BOOL) checkConnection{
   yourMethodDetails;
}

次に、プロジェクト内の任意のファイルに #import "CheckNetwork.h" を呼び出して呼び出します。

if([CheckNetwork checkConnection]){
    whatever you want to do here;
}
于 2013-03-03T01:32:21.950 に答える
0

シングルトン クラスと静的メソッドは 1 つの方法ですが、静的インライン メソッドを .h ファイルに実装し、.m ファイルとして実装することもできます。

また、サイドトークとして、NSURL と google.com を使用してインターネット接続を確認することはお勧めできません。

なぜなら、

  • 単純なping操作ではありません
  • ページ全体をダウンロードするため、時間がかかる場合があります
  • OSが提供する方法は、より根本的で適切です。

特定の Web サイトで作業している場合、その Web サイトを接続に使用するのがベスト プラクティスだと思います。Jon Skeetによるこの回答を参照してください

AppleのReachabilityフレームワークを使用することをお勧めします。

または、よりコンパクトな単一機能バージョンが必要な場合は、Reachabilty から抜粋したこの機能を使用することもできます。

+ (BOOL) reachabilityForInternetConnection;
{
    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);

    SCNetworkReachabilityFlags flags;
    if (SCNetworkReachabilityGetFlags(reachability, &flags))
    {
        return (flags & kSCNetworkReachabilityFlagsConnectionRequired);
    }
    return NO;
}
于 2013-03-09T09:40:01.143 に答える