Как определить, подключен ли пользователь iOS к сотовой сети по сравнению с Wi-Fi? - PullRequest
0 голосов
/ 18 января 2019

Мне нужно различать пользователя iPhone / iPad, подключенного к сотовой связи, и Wi-Fi. Под SCNetworkReachabilityFlag .isWWAN Apple говорит:

The absence of this flag does not necessarily mean that a connection will never pass over a cellular network. If you need to robustly prevent cellular networking, read Avoiding Common Networking Mistakes in Networking Overview.

Это означает, что если этот флаг включен, пользователь, скорее всего, подключается через сотовую сеть, но это не гарантируется. Я прочитал Как избежать распространенных сетевых ошибок , но это бесполезно.

Как я могу быть на 100% уверен, что пользователь находится в сотовой сети (или нет)?

Мой код выглядит так:

let reachability = SCNetworkReachabilityCreateWithName(nil, "localhost")
var flags = SCNetworkReachabilityFlags()
if let reachability = reachability {
    SCNetworkReachabilityGetFlags(reachability, &flags)
}
let isConnectedToCellular = flags.contains(.isWWAN)

РЕДАКТИРОВАТЬ:

Если вы используете этот код, обязательно вызовите его в фоновом потоке, а не в основном потоке.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

надеюсь, что это поможет

   func getWiFiName() -> String? {
            var ssid: String?
            if let interfaces = CNCopySupportedInterfaces() as NSArray? {
                for interface in interfaces {
                    if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
                        ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
                        break
                    }
                }
            }
            return ssid
        }

если это возвращает ноль, то вы подключились через сотовую связь, если устройство подключено к Wi-Fi, тогда оно вернет имя Wi-Fi (SSID) не забудьте включить сетевые расширения и получить доступ к информации Wi-Fi о возможностях проекта

ЭТО НЕ РАБОТАЕТ С ИМИТАТОРОМ (ЭТО ДОЛЖНО БЫТЬ НАСТОЯЩИМ УСТРОЙСТВОМ) !!!! и добавить это два

импорт NetworkExtension

import SystemConfiguration.CaptiveNetwork

0 голосов
/ 19 января 2019

Вы можете использовать Reachability.swift Либо вы используете это, либо получите некоторое представление о том, как создается и работает какой-то определенный поток.

У него есть Соединение перечисление, которое выглядит так:

public enum Connection: CustomStringConvertible {
        case none, wifi, cellular
        public var description: String {
            switch self {
            case .cellular: return "Cellular"
            case .wifi: return "WiFi"
            case .none: return "No Connection"
            }
        }
    }

И NetworkStatus :

public enum NetworkStatus: CustomStringConvertible {
    case notReachable, reachableViaWiFi, reachableViaWWAN
    public var description: String {
        switch self {
        case .reachableViaWWAN: return "Cellular"
        case .reachableViaWiFi: return "WiFi"
        case .notReachable: return "No Connection"
        }
    }
}

И оттуда вы можете сделать следующее:

  1. Проверьте, подключено ли устройство к мобильной сети передачи данных / сотовой связи или Wi-Fi.
  2. Соблюдать достижимость / подключение к интернету.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...