Как проверить активное интернет-соединение на iOS или macOS?
Я хотел бы проверить, есть ли у меня подключение к Интернету на iOS с использованием библиотек Cocoa Touch или на macOS с использованием библиотек Cocoa.
Я придумал способ сделать это с помощью NSURL
. То, как я это сделал, кажется немного ненадежным (потому что даже Google однажды может оказаться неработоспособным, а полагаться на стороннюю компанию - плохо), и хотя я мог проверить, есть ли ответ от других веб-сайтов, если Google не отвечает, это действительно кажется расточительным и ненужными накладными расходами на мое приложение.
- (BOOL) connectedToInternet
{
NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
return ( URLString != NULL ) ? YES : NO;
}
Это то, что я сделал плохо (не говоря stringWithContentsOfURL
о stringWithContentsOfURL
устарела в iOS 3.0 и macOS 10.4), и если да, то как лучше это сделать?
Ответы
Ответ 1
Важно: эта проверка всегда должна выполняться асинхронно. Большинство ответов ниже являются синхронными, поэтому будьте осторожны, иначе вы заморозите свое приложение.
стриж
1) Установите через CocoaPods или Карфаген: 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
для Tony Million (см. Здесь: 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
является одним из наиболее часто используемых классов в проектах, поэтому вы можете столкнуться с конфликтами имен с другими проектами. Если это произойдет, вам придется переименовать одну из пар файлов Reachability.h
и Reachability.m
во что-то другое, чтобы решить эту проблему.
Примечание: домен, который вы используете, не имеет значения. Это просто тестирование на шлюз в любой домен.
Ответ 2
Мне нравится держать вещи простыми. Способ, которым я это делаю:
//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
}
Этот метод не ждет изменения статусов сети, чтобы сделать что-то. Он просто проверяет статус, когда вы его просите.
Ответ 3
Используя код Apple Reachability, я создал функцию, которая будет проверять это правильно, без необходимости включать какие-либо классы.
Включите SystemConfiguration.framework в ваш проект.
Сделайте некоторый импорт:
#import <sys/socket.h>
#import <netinet/in.h>
#import <SystemConfiguration/SystemConfiguration.h>
Теперь просто вызовите эту функцию:
/*
Connectivity testing code pulled from Apple 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 проверено для вас.
Ответ 4
Это был правильный ответ, но он устарел, поскольку вместо этого вы должны подписаться на уведомления о достижении. Этот метод проверяет синхронно:
Вы можете использовать класс 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 в свой проект.
Ответ 5
Вот очень простой ответ:
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, но если бы у меня был надежный веб-сервер, я бы загрузил небольшой файл с одним символом в нем для максимальной скорости.
Если проверить, каким образом устройство каким-то образом связано с Интернетом, это все, что вы хотите сделать, я определенно рекомендую использовать это простое решение. Если вам нужно знать, как подключен пользователь, использование возможности Reachability - путь.
Осторожно: это будет кратковременно блокировать поток при загрузке веб-сайта. В моем случае это не проблема, но вы должны это учитывать (кредиты Брэду указывают на это).
Ответ 6
Вот как я это делаю в своих приложениях: хотя код ответа статуса 200 ничего не гарантирует, он достаточно стабилен для меня. Это не требует такой загрузки, как ответы NSData, размещенные здесь, так как мои просто проверяют ответ HEAD.
Swift Code
func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
UIApplication.sharedApplication().networkActivityIndicatorVisible = true
let url = NSURL(string: "http://www.appleiphonecell.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 Apple region universal URL reachable
}
else
{
// No "Internet" aka Apple region universal URL un-reachable
}
})
}
Objective-C Код
typedef void(^connection)(BOOL);
- (void)checkInternet:(connection)block
{
NSURL *url = [NSURL URLWithString:@"http://www.appleiphonecell.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 Apple region universal URL reachable
}
else
{
// No "Internet" aka Apple region universal URL un-reachable
}
}];
}
Ответ 7
Apple поставляет пример кода, чтобы проверить наличие разных типов сети. Кроме того, в куковой книге разработчиков iPhone есть .
Примечание.. Обратите внимание на комментарий @KHG, касающийся использования кода доступности Apple.
Ответ 8
Вы можете использовать Reachability
помощью (доступно здесь).
#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.
Ответ 9
Apple предоставляет пример приложения, которое выполняет именно это:
Reachability
Ответ 10
Обновлен только класс 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");}
Ответ 11
Версия для Reachability для iOS 5 darkseed/Reachability.h. Это не мое! =)
Ответ 12
Здесь есть приятная, ARC- и GCD-модернизация Reachability:
Reachability
Ответ 13
Если вы используете 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
enums (здесь).
Ответ 14
Я использовал код в это обсуждение, и, похоже, он работает нормально (прочитайте всю тему!).
Я не тестировал его полностью со всеми возможными типами соединений (например, ad hoc Wi-Fi).
Ответ 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");
}
}
Ответ 16
-(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;
}
}
Ответ 17
- (void)viewWillAppear:(BOOL)animated
{
NSString *URL = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
return (URL != NULL ) ? YES : NO;
}
Или используйте класс Reachability.
Существует два способа проверки доступности Интернета с помощью iPhone SDK:
1. Проверьте, открыта ли страница Google или нет.
2. Класс достижимости
Для получения дополнительной информации см. Reachability (разработчик Apple).
Ответ 18
Используйте http://huytd.github.io/datatify/. Это проще, чем добавлять библиотеки и писать код самостоятельно.
Ответ 19
Первый: добавьте 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");
}
}
Ответ 20
Сначала загрузите класс достижимости и поместите файл 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;
}
Теперь вы можете проверить сетевое подключение в любом классе, вызвав этот метод класса.
Ответ 21
Существует еще один способ проверить подключение к Интернету с помощью 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;
}
Ответ 22
Для этого очень просто. Будет работать следующий метод. Просто не забудьте передать протокол имени хоста, такой как HTTP, HTTPS и т.д. С именем.
-(BOOL)hasInternetConnection:(NSString*)urlAddress
{
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [urlAddress UTF8String]);
SCNetworkReachabilityFlags flags;
if (!SCNetworkReachabilityGetFlags(ref, &flags))
{
return NO;
}
return flags & kSCNetworkReachabilityFlagsReachable;
}
Это быстро и безболезненно.
Ответ 23
Я нашел его простой и простой в использовании библиотекой SimplePingHelper.
Пример кода: chrishulbert/SimplePingHelper (GitHub)
Ответ 24
Первый: добавьте 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");
}
}
Ответ 25
Класс Reachability в порядке, чтобы узнать, доступно ли подключение к Интернету устройству или нет.
Но в случае доступа к ресурсу интрасети:
Pinging сервер интрасети с классом достижимости всегда возвращает 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;
}
}
Этот метод был настолько полезен для меня, поэтому всякий раз, когда я пытаюсь отправить некоторые данные на сервер, я всегда проверяю доступность моего ресурса интрасети с помощью этого минимального URL-адреса URL-адреса.
Ответ 26
Помимо достижимости вы также можете использовать Простую вспомогательную библиотеку Ping. Он работает очень хорошо и легко интегрируется.
Ответ 27
Я думаю, что это лучший ответ.
"Да" означает соединение. "Нет" означает "отключено".
#import "Reachability.h"
- (BOOL)canAccessInternet
{
Reachability *IsReachable = [Reachability reachabilityForInternetConnection];
NetworkStatus internetStats = [IsReachable currentReachabilityStatus];
if (internetStats == NotReachable)
{
return NO;
}
else
{
return YES;
}
}
Ответ 28
Импортируйте класс Reachable.h
в ViewController
и используйте следующий код для проверки подключения:
#define hasInternetConnection [[Reachability reachabilityForInternetConnection] isReachable]
if (hasInternetConnection){
// To-do block
}
Ответ 29
- Шаг 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");
}
Ответ 30
Проверка доступности интернет-соединения в (iOS) Xcode 8, Swift 3.0
Это простой способ проверки доступности сети, так как наше устройство подключено к какой-либо сети или нет. Мне удалось перевести его в Swift 3.0, а здесь - окончательный код. Существующий класс Apple Reachability и другие сторонние библиотеки казались слишком сложными для перевода на Swift.
Это работает как для 3G, 4G, так и для Wi-Fi-соединений.
Не забудьте добавить "SystemConfiguration.framework" к вашему строителю проектов.
//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")
}