2

下面的方法非常适用于检查用户是否有互联网连接。我想检查整个应用程序中的互联网连接,并且想知道是否可以将它放在我的 App Delegate 中的某个地方,它将被每个视图控制器调用。

有没有办法做到这一点?如果我把它放在我的 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;
}
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

当然有更复杂的方法,但最简单的方法(也是我使用的方法)是简单地创建一个“CheckNetwork”类,将您的方法作为返回布尔值的类方法,即:

+ (BOOL) checkConnection{
   yourMethodDetails;
}

然后只需将#import "CheckNetwork.h" 导入项目中的任何文件并调用

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

虽然 Singleton 类和静态方法是一种方法,但您也可以在 .h 文件中实现静态内联方法,因为没有 .m 文件

此外,作为旁白,使用 NSURL 和 google.com 来检查互联网连接并不是一个好习惯。

因为,

  • 这不是一个简单的 ping 操作
  • 它下载整个页面,这可能会消耗时间
  • 操作系统提供的方式更加激进和恰当。

如果您正在使用特定的网站,那么使用该网站进行连接是最佳实践,我认为。请参阅Jon Skeet这个答案

我建议使用 Apple 的可达性框架。

或者如果您需要更紧凑的单功能版本,您也可以使用我自己摘自 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 回答