Как проверить активное интернет-соединение на iOS или macOS?

Проблема, которую я пытаюсь решить, была либо в отдельных файлах классов, либо в одном уникальном, но уникальном классе, а не в том же пространстве имен, содержащем несколько классов. В результате я искал аналогичный ответ и нашел эту ссылку для обмена Получение xsd.exe Чтобы не создавать повторяющиеся классы

Это простое исправление, но мне потребовалось долгое время выяснять. Вы должны использовать xsd.exe для компиляции всех ваших классов сразу, поэтому вместо двух отдельных команд вам просто нужно выполнить одно: C: \ Solution \ Project> xsd.exe Types.xsd Request.xsd Response.xsd / c Теперь у вас есть один файл Response.xsd со всеми тремя классами в нем.

1300
задан Tamás Sengel 12 March 2018 в 16:08
поделиться

7 ответов

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


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) Добавьте версию Tony Million 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];
}

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

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

1275
ответ дан 19 December 2019 в 20:15
поделиться

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


Вы можете использовать класс 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.

120
ответ дан 19 December 2019 в 20:15
поделиться

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

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

56
ответ дан 19 December 2019 в 20:15
поделиться

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

Reachability

39
ответ дан 19 December 2019 в 20:15
поделиться

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

Я не тестировал его полностью с помощью все мыслимые виды подключения (например, специальный Wi-Fi).

18
ответ дан 19 December 2019 в 20:15
поделиться

Обновлен только класс 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");}
33
ответ дан 19 December 2019 в 20:15
поделиться

попробуйте это, это поможет Вам (Swift 4)

1) Установка Достижимость Виа CocoaPods, , или Карфаген: Достижимость

2) Достижимость Импорта и Использование в Сеть Класс

import Reachability
class Network {

   private let internetReachability : Reachability?
   var isReachable : Bool = false

   init() {

       self.internetReachability = Reachability.init()
       do{
           try self.internetReachability?.startNotifier()
           NotificationCenter.default.addObserver(self, selector: #selector(self.handleNetworkChange), name: .reachabilityChanged, object: internetReachability)
       }
       catch {
        print("could not start reachability notifier")
       }
   }

   @objc private func handleNetworkChange(notify: Notification) {

       let reachability = notify.object as! Reachability
       if reachability.connection != .none {
           self.isReachable = true
       }
       else {
           self.isReachable = false
       }
       print("Internet Connected : \(self.isReachable)") //Print Status of Network Connection
   }
}

3) Использование как Ниже, где Вам нужно.

var networkOBJ = Network()
// Use "networkOBJ.isReachable" for Network Status
print(networkOBJ.isReachable) 
1
ответ дан 19 December 2019 в 20:15
поделиться