Вопрос по macos, ios, cocoa-touch, reachability, cocoa – Как проверить активное интернет-соединение на iOS или macOS?

1276

Я хотел бы проверить, есть ли у меня подключение к Интернету на iOS с помощьюКакао Touch библиотеки или на MacOS, используяКакао библиотеки.

Я придумал способ сделать это с помощьюNSURL, То, как я это сделал, кажется немного ненадежным (потому что даже Google однажды может оказаться неработоспособным, а полагаться на третье лицо кажется плохим), и хотя я мог проверить, есть ли ответ от других веб-сайтов, если 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), и если да, то как лучше это сделать?

Для тех, кто недавно нашел этот ответ:stackoverflow.com/a/8813279 afollestad
Ваше решение умное, и я предпочитаю это. Вы также можете использоватьNSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://twitter.com/getibox"] encoding:NSUTF8StringEncoding error:nil]; Избавиться от надоедливого предупреждения. Abdelrahman Eid
попробуйте использовать класс Reachability по ссылке ниже, он будет работать для васgithub.com/tonymillion/Reachability Dhaval H. Nena
Скорееreturn (BOOL)URLString;или даже лучше,return !!URLString или жеreturn URLString != nil user529758
Я не знаю, каков ваш вариант использования, но если вы можете, то предпочтительнее попробовать запрос и обработать любые ошибки, такие как отсутствие соединения, которое возникает. Если вы не можете этого сделать, то в этом случае есть много полезных советов. SK9

Ваш Ответ

30   ответов
25

Здесь есть привлекательная модернизация Reachability с использованием ARC и GCD:

достижимость

6

ИмпортироватьReachable.h класс в вашемViewControllerи используйте следующий код для проверкиconnectivity:

     #define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
     if (hasInternetConnection){
           // To-do block
     }
Ваш ответ - именно то, что я ищу. Вы, сэр, заслуживаете голосования до XD
7

Я думаю, что это лучший ответ.

& Quot; Да & Quot; значит подключен. & Quot; Нет & Quot; значит отключен.

#import "Reachability.h"

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

    if (internetStats == NotReachable)
    {
        return NO;
    }
    else
    {
        return YES;
    }
}
11
- (void)viewWillAppear:(BOOL)animated
{
    NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];

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

Или используйтеReachability class.

Есть два способа проверить доступность Интернета с помощью iPhone SDK:

1. Check the Google page is opened or not.

2. Reachability Class

Для получения дополнительной информации, пожалуйста, обратитесь кдостижимость (Apple Developer).

пожалуйста, позаботьтесь о форматировании ...
Есть два способа проверить доступность интернета в iPhone SDK 1) Проверить, открыта страница Google или нет.
-1: это синхронный метод, который блокирует основной поток (тот, на котором изменен пользовательский интерфейс приложения), когда он пытается подключиться к google.com. Если у вашего пользователя очень медленное соединение для передачи данных, телефон будет действовать так, как будто процесс не отвечает.
10

использованиеhttp://huytd.github.io/datatify/, Это проще, чем добавлять библиотеки и писать код самостоятельно.

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;
}
}
Даже если устройство подключено к Wi-Fi или сети другого типа, подключение к Интернету может быть недоступно. Простой тест: подключитесь к домашней сети Wi-Fi, а затем отключите кабельный модем. Все еще подключен к Wi-Fi, но без интернета.
10

First: ДобавлятьCFNetwork.framework в рамках

Code: 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");
    }
}
119

Раньше это был правильный ответ, но теперь он устарел, так как вместо этого вы должны подписаться на уведомления о доступности. Этот метод проверяет синхронно:

Вы можете использовать класс доступности Apple. Это также позволит вам проверить, включен ли 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 в ваш проект.

Этот код является хорошей отправной точкой для вещей, которые вам нужно установить, прежде чем вы сможете использовать методы делегата для класса достижимости. Brock Woolf
Смотрите мой комментарий выше о том, чтобы не использовать такую доступность. Используйте его в асинхронном режиме и подпишитесь на уведомления, которые он отправляет - не делайте.
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;
}
7

Помимо досягаемости вы также можете использоватьПростая вспомогательная библиотека Ping, Он работает действительно хорошо и прост в интеграции.

22

Если вы используетеAFNetworking Вы можете использовать его собственную реализацию для статуса доступности интернета.

Лучший способ использоватьAFNetworking это подклассAFHTTPClient Класс и использовать этот класс для подключения к сети.

Одним из преимуществ использования этого подхода является то, что вы можете использоватьblocks установить желаемое поведение при изменении состояния достижимости. Предположим, что я создал одноэлементный подклассAFHTTPClient (как сказано в «Примечаниях по подклассам» наAFNetworking документы) названныйBKHTTPClientЯ бы сделал что-то вроде:

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

Вы также можете проверить соединения Wi-Fi или WLAN, используяAFNetworkReachabilityStatusReachableViaWWAN а такжеAFNetworkReachabilityStatusReachableViaWiFi перечисления (больше здесь).

Пожалуйста, обновите ссылки в этой теме.
1248

Important: Эта проверка должнаalways выполняться асинхронно. Большинство приведенных ниже ответов являются синхронными, поэтому будьте осторожны, иначе вы "заморозите" свое приложение.

Swift

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

Important Note: Reachability class является одним из наиболее часто используемых классов в проектах, поэтому вы можете столкнуться с конфликтами имен с другими проектами. Если это произойдет, вам придется переименовать одну из парReachability.h а такжеReachability.m файлы к чему-то еще, чтобы решить проблему.

Note: Используемый вами домен не имеет значения. Это просто проверка шлюза в любой домен.

О, кстати, вам нужно добавитьSystemConfiguration.framework к проекту (для метода 1).
Используйте www.appleiphonecell.com вместо google.com - этот URL был создан Apple именно по этой причине.
Когда они говорят о доступности хоста, они на самом деле говорят о том,gateway к хосту можно добраться или нет. Они не хотят сказать, что & quot; google.com & quot; или & quot; apple.com & quot; доступно, но тем более, что средство для достижения этого есть.
@KaanDedeoglu Это всего лишь пример, используйте любой домен, который вы хотите. Он просто проверяет наличие шлюза в Интернет, а не то, что домен действительно доступен.
@gonzobrains: домен, который вы используете, не имеет значения. Это просто проверка шлюза вany домен.
14

Very simple.... Try these steps:

Step 1: ДобавитьSystemConfiguration рамки в ваш проект.

Step 2: Импортируйте следующий код в вашheader файл.

#import <SystemConfiguration/SystemConfiguration.h>

Step 3: Используйте следующий метод

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

Type 2:

Import header : #import "Reachability.h"

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

Step 4: Как пользоваться:

- (void)CheckInternet
{
    BOOL network = [self currentNetworkStatus];
    if (network)
    {
        NSLog(@"Network Available");
    }
    else
    {
        NSLog(@"No Network Available");
    }
}
Я хочу исправления типа 2 из вашего ответа. Я добавил классы достижимости и попытался проверить проверку соединения, используя приведенный выше ваш ответ. он всегда доступен, даже если я подключаюсь по WiFi, но у него нет подключения к интернету. Wi-Fi не означает, что он подключен к Интернету. Я хочу проверить подключение к интернету, даже если у него есть подключение к WiFi. Можете ли вы помочь мне?
Тип 1 работал на меня!
Является ли тип 1 асинхронным?
45

Вы могли бы использоватьReachability от & # xF8FF; (доступно здесь).

#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.
Это блокирует основной поток?
32

Только класс 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");}
Если с момента выпуска 4.0 что-то не изменилось, этот код не является асинхронным, и вы гарантированно увидите его в отчетах о сбоях - это случилось со мной раньше.
Я согласен с бпапа. Использование синхронного кода не очень хорошая идея. Спасибо за информацию, хотя Brock Woolf
8

Сделать это самостоятельно очень просто. Следующий метод будет работать. Только убедитесь, что вы не разрешаете передавать имя хоста, такое как HTTP, HTTPS и т. Д.

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

Это быстро, просто и безболезненно.

8

Сначала загрузите класс достижимости и поместите файл reachability.h и reachabilty.m в свойXcode.

Лучший способ - создать общий класс функций (NSObject), чтобы вы могли использовать его в любом классе. Это два метода проверки доступности сетевого подключения:

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

Теперь вы можете проверить сетевое соединение в любом классе, вызвав этот метод класса.

6

Checking the Internet connection availability in (iOS) Xcode 8 , Swift 3.0

This is simple method for checking the network availability like our device is connected to any network or not. I have managed to translate it to Swift 3.0 and here the final code. The existing Apple Reachability class and other third party libraries seemed to be too complicated to translate to Swift.

This works for both 3G,4G and WiFi connections.

Don’t forget to add “SystemConfiguration.framework” to your project builder.

//Create new swift class file Reachability in your project.
import SystemConfiguration
public class InternetReachability {

class func isConnectedToNetwork() -> Bool {
   var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0))
   zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
   zeroAddress.sin_family = sa_family_t(AF_INET)
   let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
          SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)).takeRetainedValue()
   }
   var flags: SCNetworkReachabilityFlags = 0
   if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == 0 {
          return false
   }
   let isReachable = (flags & UInt32(kSCNetworkFlagsReachable)) != 0
   let needsConnection = (flags & UInt32(kSCNetworkFlagsConnectionRequired)) != 0

   return isReachable && !needsConnection
  }
}

// Check network connectivity from anywhere in project by using this code.
 if InternetReachability.isConnectedToNetwork() == true {
         print("Internet connection OK")
  } else {
         print("Internet connection FAILED")
  }
27

Версия на доступность для iOS 5Darkseed / Reachability.h, Это не мое! знак равно

71

Вот как я это делаю в своих приложениях: хотя код ответа 200 статуса ничего не гарантирует, он достаточно стабилен для меня. Это не требует такой большой загрузки, как ответы NSData, опубликованные здесь, так как мой просто проверяет ответ HEAD.

Swift Code
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 Code
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
         }
    }];
}
& quot; Нет Google, нет Интернета & quot; ??
По состоянию на июнь 2014 года это не получится в материковом Китае из-за того, что правительство Китая теперь полностью блокирует google.com. (google.cn работает, но в материковом Китае нет baidu.com, нет интернета) Вероятно, лучше пинговать любой сервер, с которым вам нужно общаться.
Вместо этого используйте www.appleiphonecell.com - Apple создал этот URL именно по этой причине.
Похоже, это самый быстрый способ
Предупреждение: по моему опыту, это решение не работает все время. Во многих случаях ответ возвращается 403, после того, как он потратил свое сладкое время. Это решение казалось идеальным, но не гарантирует 100% результатов.
305

Мне нравится, чтобы все было просто. Я делаю это так:

//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, вы можете попробовать решение Эндрю Циммера на этой странице, оно отлично работает с отключенным adsl (и подключенным wifi)
достижимость не определена ???
ПОЧЕМУ вы возвращаетесь! = NotReachable вместо & quot; return netWorkStatus; & quot; ???
Для тех, кто просто копирует и вставляет, как я сделал с приведенным выше кодом. Также добавьте SystemConfiguration.framework вручную, иначе вы получите ошибку компоновки.
Всегда будь доступным, если я соединяюсь с WiFi. Wi-Fi не означает, что он подключен к Интернету. Я хочу проверить подключение к интернету, даже если у него есть подключение к WiFi. Можете ли вы помочь мне?
7

Reachability class можно узнать, доступно ли интернет-соединение для устройства или нет ...

Но в случае доступа кintranet resource:

Проверка связи с сервером интрасети с помощью класса достижимости всегда возвращает значение true.

Таким образом, быстрое решение в этом сценарии было бы создать веб-метод под названиемpingme наряду с другими веб-методами на сервисе. 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 с малым временем ожидания.

6
Step 1: Add the Reachability class in your Project. Step 2: Import the Reachability class

Step 3: Create the below function

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

Step 4: Call the function as below:

if (![self checkNetConnection]) {
    [GlobalFunctions showAlert:@""
                     message:@"Please connect to the Internet!"
                     canBtntitle:nil
                     otherBtnTitle:@"Ok"];
    return;
}
else
{
    Log.v("internet is connected","ok");
}
Документы Apple утверждают этоNote: Reachability cannot tell your application if you can connect to a particular host, only that an interface is available that might allow a connection, and whether that interface is the WWAN.
80

Вот очень простой ответ:

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 должен указывать на очень маленький сайт. Я использую мобильный сайт Google здесь, но если бы у меня был надежный веб-сервер, я бы загрузилa small file with just one character in it для максимальной скорости.

Если проверить, является ли устройствоsomehow подключение к Интернету - это все, что вы хотите сделать, и я определенно рекомендую использовать это простое решение. Если вам нужно знать, как пользователь подключен, используйте Reachability.

Осторожно: это ненадолго заблокирует вашу ветку, пока он загружает сайт. В моем случае это не было проблемой, но вы должны учитывать это (благодарность Брэду за указание на это).

Документы Apple рекомендуют не делать этого, так как это может блокировать поток в медленной сети, может привести к прекращению работы приложения в iOS
LOL, я уверен, что Google благодарен вам за то, что вы предлагаете людям использовать их в качестве ресурса для проверки Интернета.
Отличное решение @Erik. Я также рекомендую вам использовать www.google.com вместо www.google.com/m, как сказал rwyland. Это странно, но из моего теста мобильная версия всегда занимает примерно 120 мс больше, чем www.google.com.
Мне очень нравится эта идея, но я бы сказал, что для надежности 99,999% при сохранении небольшого размера ответа перейдите на страницу www.google.com/m, которая является мобильным представлением для Google.
Спасибо за положительный отзыв, согласитесь, что www.google.com/m является лучшим решением из-за надежности!
8

Я нашел это простой и простой в использовании библиотекаSimplePingHelper.

Образец кода:chrishulbert / SimplePingHelper (GitHub)

144

Используя код доступности 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 & # xA0; 5 проверено для вас.

Хорошо работает и на iOS3.0, спасибо
Спасибо, эта работа, даже если вы используете Wi-Fi ADSL и ADSL не подключен, это именно то, что мне нужно.
Можете ли вы описать этот код? Как работает эта проверка?
@JezenThomas Это не выполняет интернет-проверку асинхронно, поэтому она «намного тоньше» ... Вы всегда должны делать это асинхронно, подписываясь на уведомления, чтобы не повесить приложение в этом процессе.
Это приводит к утечке памяти - «читаемость» структура (объект, вещь) должна быть освобождена с помощью CFRelease ().
56

Apple поставляетобразец кода проверить наличие разных типов доступности сети. В качестве альтернативы естьпример в кулинарной книге разработчиков iPhone.

Note: См. Комментарий @ KHG к этому ответу относительно использования кода доступности Apple.

Благодарю. Я обнаружил, что документация Xcode в версии 3.0 также содержит исходный код, который можно найти в результате поиска & quot; достижимости & quot; в документации. Brock Woolf
Обратите внимание, что новая редакция (09-08-09) образца кода Reachability от Apple является асинхронной.
18

Я использовал код вэто обсуждениеи, кажется, работает нормально (читайтеwhole нить!).

Я не тестировал его исчерпывающе на всех возможных типах соединений (например, на Wi-Fi ad hoc).

этот код не совсем хорош, потому что он просто проверяет, есть ли у вас Wi-Fi-соединение с маршрутизатором, а не доступ к сети. Вы можете включить Wi-Fi и продолжить доступ к сети.
8

Download the Reachability file, https://gist.github.com/darkseed/1182373

And add CFNetwork.framework and 'SystemConfiguration.framework' in framework

Do #import "Reachability.h"


First: ДобавлятьCFNetwork.framework в рамках

Code: 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");
    }
}
39

Apple предоставляет пример приложения, которое делает именно это:

достижимость

К счастью, в 3.0 ситуация намного лучше, так как система предоставит страницу входа для пользователей за заблокированным WiFi, где вы должны войти в систему, чтобы использовать ... вы используете для проверки перенаправления вручную (и вы все еще делаете при разработке приложений 2.2.1)
Я бы не сказал, что приложение Reachability выполняет именно то, что запрашивается. Однако это хорошая отправная точка для добавления запрашиваемой функциональности,
Следует отметить, что образец Reachability обнаруживает только то, какие интерфейсы активны, но не какие из них имеют действительное подключение к Интернету. Приложения должны корректно обрабатывать ошибки, даже когда Reachability сообщает, что все готово к работе.

Похожие вопросы