2015-07-31 2 views
9

Мне интересно, как я могу проверить, подключен ли пользователь к Интернету через WIFI или сотовые данные 3G или 4G.Как проверить подключение к Интернету на устройстве iOS?

Кроме того, я не хочу проверять, доступен ли сайт или нет, то, что я хочу проверить, есть ли на нем интернет или нет. Я пытался просмотреть через Интернет все, что я вижу, это то, что они проверяют, доступен ли сайт или нет, используя класс Rechability.

Я хочу проверить, есть ли у пользователя интернет или нет, когда он открывает мое приложение.

Я использую Xcode6 с Objective-C.

+0

Мой вопрос не дублируется, этот учебник проверяет доступность сервера Google, однако мой вопрос заключается в том, как проверить Интернет, не пытаясь подключиться к серверу веб-сайта. – SniperCoder

+0

Вы также можете увидеть здесь: [http://stackoverflow.com/questions/6129219/check-if-iphone- is-connected-to-the-internet/33447730 # 33447730] (http://stackoverflow.com/questions/6129219/check-if-iphone-is-connected-to-the-internet/33447730#33447730) –

ответ

15

Используйте этот код и импортировать файл Reachability.h

if ([[Reachability reachabilityForInternetConnection]currentReachabilityStatus]==NotReachable) 
    { 
     //connection unavailable 
    } 
    else 
    { 
     //connection available 
    } 
+0

Я мог бы не найти файл Reachability.h! – SniperCoder

+0

@SniperCoder Загрузите и поместите этот класс в свой проект. https://github.com/tonymillion/Reachability –

+0

@SniperCoder Попробуйте #import "Reachability.h". В моем x-коде он не отображается в автоматическом предложении, но компилирует код –

2

Надеется, что это поможет вам в сеть в режиме Wi-Fi только:

Utils.h

#import <Foundation/Foundation.h> 
@interface Utils : NSObject 

+(BOOL)isNetworkAvailable; 

@end 

utils.m

+ (BOOL)isNetworkAvailable 
{ 
     CFNetDiagnosticRef dReference; 
     dReference = CFNetDiagnosticCreateWithURL (NULL, (__bridge CFURLRef)[NSURL URLWithString:@"www.apple.com"]); 

     CFNetDiagnosticStatus status; 
     status = CFNetDiagnosticCopyNetworkStatusPassively (dReference, NULL); 

     CFRelease (dReference); 

     if (status == kCFNetDiagnosticConnectionUp) 
     { 
      NSLog (@"Connection is Available"); 
      return YES; 
     } 
     else 
     { 
      NSLog (@"Connection is down"); 
      return NO; 
     } 
    } 

// Теперь используем это в требуемом классе

- (IBAction)MemberSubmitAction:(id)sender { 
    if([Utils isNetworkAvailable] ==YES){ 

     NSlog(@"Network Connection available"); 
    } 

} 
+0

Это решение не будет работать, если устройство подключено к 3G/LTE. – Hamsternik

0

Попробуйте этот

Проверить эту ссылку для достижимости файла

Reachability

импортировать этот файл в. м, а затем написать код

// Это проверить подключение к Интернету

BOOL hasInternetConnection = [[Reachability reachabilityForInternetConnection] isReachable]; 
    if (hasInternetConnection) { 
       // your code 
    } 

Надеется, что это помогает.

5

Первые классы Скачать достижимости этой ссылке:
Rechability from Github

Добавить экземпляр достижимости в AppDelegate.h

@property (nonatomic) Reachability *hostReachability; 
@property (nonatomic) Reachability *internetReachability; 
@property (nonatomic) Reachability *wifiReachability; 

Импорт достижимости в вашем AppDelegate и просто скопировать и мимо этого кода в ваш Appdelegate.m

- (id)init 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     //[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; 
     NSString *remoteHostName = @"www.google.com"; 
     self.hostReachability = [Reachability reachabilityWithHostName:remoteHostName]; 
     [self.hostReachability startNotifier]; 

     self.internetReachability = [Reachability reachabilityForInternetConnection]; 
     [self.internetReachability startNotifier]; 

     self.wifiReachability = [Reachability reachabilityForLocalWiFi]; 
     [self.wifiReachability startNotifier]; 
    } 
    return self; 
} 

Добавьте этот метод в свой общий класс.

/*================================================================================================ 
Check Internet Rechability 
=================================================================================================*/ 
+(BOOL)checkIfInternetIsAvailable 
{ 
    BOOL reachable = NO; 
    NetworkStatus netStatus = [APP_DELEGATE1.internetReachability currentReachabilityStatus]; 
    if(netStatus == ReachableViaWWAN || netStatus == ReachableViaWiFi) 
    { 
     reachable = YES; 
    } 
    else 
    { 
     reachable = NO; 
    } 
    return reachable; 
} 

Обратите внимание, что APP_DELEGATE1 является экземпляром AppDelegate

/* AppDelegate object */ 
#define APP_DELEGATE1 ((AppDelegate*)[[UIApplication sharedApplication] delegate]) 

Вы можете проверить подключение к Интернету в любом месте приложения с помощью этого метода.

3

Это просто, вы можете использовать следующий метод для проверки подключения к Интернету.

-(BOOL)IsConnectionAvailable 
{ 
    Reachability *reachability = [Reachability reachabilityForInternetConnection]; 

    NetworkStatus networkStatus = [reachability currentReachabilityStatus]; 

    return !(networkStatus == NotReachable);  
} 
0
Reachability* reachability = [Reachability reachabilityWithHostName:@"www.google.com"]; 
NetworkStatus internetStatus = [reachability currentReachabilityStatus]; 

if(remoteHostStatus == ReachableViaWWAN || remoteHostStatus == ReachableViaWiFi) 

{ 


    //my web-dependent code 
} 
else { 
    //there-is-no-connection warning 
} 
1

Попробуйте это проверить интернет подключен или не

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:nil delegateQueue: [NSOperationQueue mainQueue]]; 

NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest 
                completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) 
            { 
             if (!error && response) 
             { 
              block([(NSHTTPURLResponse *)response statusCode] == 200); 
             }else{ 
              block(FALSE); 
             } 
            }]; 
[dataTask resume]; 
1

«достижимость» не работает, так как он не будет обнаружить, если есть ответ от хоста или нет. Он просто проверит, может ли клиент отправить пакет на хост. Таким образом, даже если вы подключены к сети Wi-Fi и интернет Wi-Fi отключен или сервер не работает, вы получите «ДА» для достижения доступности.

Лучшим методом является попытка HTTP-запроса и проверка ответа.

Пример ниже:

NSURL *pageToLoadUrl = [[NSURL alloc] initWithString:@"https://www.google.com/"]; 
NSMutableURLRequest *pageRequest = [NSMutableURLRequest requestWithURL:pageToLoadUrl]; 
[pageRequest setTimeoutInterval:2.0]; 
AFHTTPRequestOperation *pageOperation = [[AFHTTPRequestOperation alloc] initWithRequest:pageRequest]; 
AFRememberingSecurityPolicy *policy = [AFRememberingSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; 
[policy setDelegate:self]; 
currentPageOperation.securityPolicy = policy; 
if (self.ignoreSSLCertificate) { 
    NSLog(@"Warning - ignoring invalid certificates"); 
    currentPageOperation.securityPolicy.allowInvalidCertificates = YES; 
} 
[pageOperation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    internetActive = YES; 
} failure:^(AFHTTPRequestOperation *operation, NSError *error){ 
    NSLog(@"Error:------>%@", [error description]); 
    internetActive = NO; 
}]; 
[pageOperation start]; 

только улов в том, что «internetActive» обновляется с задержкой Шифрование до истечения времени ожидания, указанного в приведенном выше коде. Вы можете закодировать внутри обратного вызова, чтобы действовать по статусу.

0

Использование Alamofire library:

let reachabilityManager = NetworkReachabilityManager() 
let isReachable = reachabilityManager.isReachable 

if (isReachable) { 
    //Has internet 
}else{ 
    //No internet 
} 
+0

Это также проверяет, подключено ли устройство к сети, а не к сети, подключенной к Интернету. –

+0

см. Мой новый ответ –

1

Обновленный ответ для Swift 4.0 & AlamoFire:

Ответ, который я отправил 18 сентября неверен, он обнаруживает, только если он подключен к сети, а не Интернет. Вот правильное решение с использованием AlamoFire:

1) Создать пользовательский класс достижимости Observer:

import Alamofire 

class ReachabilityObserver { 

    fileprivate let reachabilityManager = NetworkReachabilityManager() 
    fileprivate var reachabilityStatus: NetworkReachabilityManager.NetworkReachabilityStatus = .unknown 

    var isOnline: Bool { 
     if (reachabilityStatus == .unknown || reachabilityStatus == .notReachable){ 
      return false 
     }else{ 
      return true 
     } 
    } 

    static let sharedInstance = ReachabilityObserver() 
    fileprivate init() { 
     reachabilityManager?.listener = { 
      [weak self] status in 

      self?.reachabilityStatus = status 
      NotificationCenter.default.post(
       name: NSNotification.Name(rawValue: ClickUpConstants.ReachabilityStateChanged), 
       object: nil) 
     } 
     reachabilityManager?.startListening() 
    } 
} 

2) Инициализировать на приложение запускается

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    _ = ReachabilityObserver.sharedInstance 
    return true 
} 

3) Используйте это где-нибудь в приложении к обнаружение, если он находится в сети, например, при загрузке, или когда происходит действие

if (ReachabilityObserver.sharedInstance.isOnline){ 
    //User is online 
}else{ 
    //User is not online 
} 
Смежные вопросы