在整个应用程序中运行互联网连接检查



下面的方法对于检查用户是否有互联网连接非常有效。我想检查整个应用程序的互联网连接,我想知道是否有地方我可以把它放在我的应用程序委托中,它将从每个视图控制器调用。

有办法做到这一点吗?如果我把它放在applicationDidFinishLaunching中,它似乎不能正常工作。有什么建议就太好了!谢谢你!

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;
}

如果您希望将此特定方法放置在可以从整个应用程序访问和调用的位置,那么这只是一个设计决策。有很多方法可以达到这个目的。

我喜欢在实现全局方法时使用单例范式。约翰·华兹华斯(John Wordsworth)在这里写了一篇简洁的博文:

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];

当然有更复杂的方法,但最简单的方法,(和我使用的方式)是简单地创建一个"CheckNetwork"类与你的方法作为一个类方法返回bool值,即:

+ (BOOL) checkConnection{
   yourMethodDetails;
}

然后只需#import "CheckNetwork.h"到项目中的任何文件中,然后调用

if([CheckNetwork checkConnection]){
    whatever you want to do here;
}

虽然单例类和静态方法是一种方法,但您也可以在.h文件中实现静态内联方法,而不是.m文件

另外,顺便说一下,使用NSURL和google.com来检查互联网连接不是一个好的做法。

,

    这不是一个简单的ping操作
  • 下载整个页面,可能会占用时间
  • OS提供的方法更加激进和合适。

如果你正在使用一个特定的网站,那么使用该网站的连接是最好的做法,我认为。参见这个答案作者:Jon Skeet

我建议苹果使用可达性框架。

或者如果你需要更紧凑的单函数版本,你也可以使用这个从可达性自己摘录的函数

+ (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;
}

最新更新