Когда я пытаюсь проверить подключение к Интернету на моем iPhone, я получаю кучу ошибок. Может кто-нибудь помочь мне исправить это?
Код:
import Foundation
import SystemConfiguration
public class Reachability {
class func isConnectedToNetwork() -> Bool {
var zeroAddress = sockaddr_in()
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress))
zeroAddress.sin_family = sa_family_t(AF_INET)
let defaultRouteReachability = withUnsafePointer(&zeroAddress) {
SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}
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) ? true : false
}
}
Ошибки с кодом:
Если это нечитаемо, ошибка 1 говорит:
Int не может быть преобразовано в SCNetworkReachabilityFlags.
Ошибка 2 и 3:
Не удалось найти перегрузку для 'init', который принимает предоставленные аргументы
ios
swift
xcode
reachability
b3rge
источник
источник
Ответы:
Для решения проблемы 4G, упомянутой в комментариях, я использовал реализацию достижимости @AshleyMills как справочную и переписанную Reachability for Swift 3.1:
обновлено: Xcode 10.1 • Swift 4 или новее
Файл Reachability.swift
использование
Инициализируйте его в вашем методе AppDelegate.swift didFinishLaunchingWithOptions и обработайте все возможные ошибки:
И образец контроллера представления:
Пример проекта
источник
if SCNetworkReachabilityGetFlags(…)
поскольку xCode возвращает Bool в последней версии.Для Swift 3, Swift 4 (работа с сотовой связью и Wi-Fi):
Использование:
источник
Создайте новый файл Swift в своем проекте, назовите его
Reachability.swift
. Вырежьте и вставьте в него следующий код, чтобы создать свой класс.Вы можете проверить интернет-соединение в любом месте вашего проекта, используя этот код:
Если пользователь не подключен к Интернету, вы можете показать ему диалоговое окно с предупреждением, чтобы уведомить его.
Объяснение:
Мы создаем открытый класс многократного использования и метод, который можно использовать в любом месте проекта для проверки интернет-соединения. Нам требуется добавить основы и конфигурации системы.
В общедоступном классе Reachability метод
isConnectedToNetwork() -> Bool { }
вернет значение bool о подключении к Интернету. Мы используем цикл if для выполнения необходимых действий в случае. Надеюсь, этого достаточно. Ура!источник
Если кто-то уже использует Alamofire, тогда -
Использование:
источник
Я проверил реализацию класса Reachability Эшли Милл без Cocoa Pods / Dependancy Manager. Идея состоит в том, чтобы сделать зависимость Reachability свободной в проекте.
Xcode 7.2 - Swift 2.1
1) https://github.com/ashleymills/Reachability.swift . Скачать добавить класс Reachability в проект.
Примечание. При добавлении убедитесь, что установлен флажок «Копировать элементы при необходимости».
2) Создайте класс AppManager.swift. Этот класс будет обслуживать класс Public Model, куда будут добавляться публичные методы и данные, и его можно использовать в любом VC.
3) Создайте делегатский класс. Я использую метод делегата для уведомления о состоянии подключения.
4) Сделать родительский класс UIViewController (метод наследования). У родительского класса есть методы, которые доступны всем дочерним VC.
5) Запустите мониторинг интернет-соединения в реальном времени в AppDelegate.
6) Я добавил AppReference в Swift File Name для хранения постоянных значений перечисления.
7) На ViewController (например, вы хотите вызывать API, только если сеть доступна)
Образец можно скачать @ https://github.com/alvinreuben/Reachability-Sample.
Обновлен до Swift 3.1 - https://github.com/alvinvgeorge/Reachability-UpgradedToSwift3
источник
Apple представила Network Framework в iOS12.
источник
pathUpdateHandler
введет сильную ссылкуself
, добавьте,[weak self]
чтобы решить ее :)Используйте это для Swift-5 +
Использование:
Или просто используйте это
framework
для большегоUtilities
: ссылкаисточник
Просто понял это для себя.
Xcode: 7.3.1, iOS 9.3.3
Используя ashleymills / Reachability.swift в качестве Reachability.swift в моем проекте, я создал следующую функцию:
Просто позвоните
hasConnectivity()
туда, где вам нужно, чтобы проверить соединение. Это работает для Wi-Fi, а также сотовой связи.Добавление ashleymills's Reachability.swift, чтобы людям не приходилось перемещаться между сайтами:
источник
let reachability: Reachability = try Reachability.reachabilityForInternetConnection()
наlet reachability: Reachability = try Reachability()!
Хотя это не дает прямого ответа на ваш вопрос, я хотел бы упомянуть, что Apple недавно провела эту беседу:
https://developer.apple.com/videos/play/wwdc2018/714/
Около 09:55 он говорит о том, что вы делаете:
Однако здесь есть несколько подводных камней:
Следующие пункты - некоторые лучшие практики согласно Apple:
waitsForConnectivity
в true ( https://developer.apple.com/documentation/foundation/urlsessionconfiguration/2908812-waitsforconnectivity )taskIsWaitingForConnectivity
( https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/2908819-urlsession ). Это рекомендуемый Apple способ проверки подключения, как упоминалось в видео на 33:25.Согласно сообщению, не должно быть никаких причин предварительно проверять, подключено ли у вас подключение к Интернету или нет, поскольку оно может быть неточным во время отправки запроса на сервер .
источник
Я сделал свое собственное решение, используя NSTimer и Alamofire:
NSTimer используется как тайм-аут и использовался из-за ненадежных результатов с использованием тайм-аута Alamofire. Запрос должен быть направлен на надежный URL-адрес, например на ваш собственный сервер или сервер, на котором размещены службы, от которых вы зависите.
Когда таймер истекает, запрос отменяется и результаты возвращаются с использованием обработчика завершения.
Использование:
источник
requestTimeout()
будет вызван после истечения указанного времени ожиданияЕсли вы используете Alamofire, вы можете сделать что-то вроде этого:
источник
Swift 5
В любом методе используйте условие ниже
источник
здесь мое решение для Swift 2.3 с lib ( Reachability.swift )
Зайдите в свой
Podfile
и добавьте:Тогда в ваш
terminal
:Затем создайте новый файл
ReachabilityManager
и добавьте код ниже:Как это использовать:
зайдите в свой
AppDelegate.swift
и добавьте код ниже:Затем, когда вы хотите проверить, подключено ли устройство к Интернету, выполните:
источник
Хотя он может не определять напрямую, подключен ли телефон к сети, самое простое (самое чистое?) Решение - это «пропинговать» Google или какой-либо другой сервер (что невозможно, если телефон не подключен к сети). ):
Если вы обеспокоены тем, что сервер может быть недоступен или может заблокировать ваш IP-адрес, вы всегда можете пропинговать несколько серверов одинаковым образом и узнать, доступен ли какой-либо из них. Или кто-то настроил выделенный сервер только для этой цели.
источник
С помощью приведенного ниже кода вы можете проверить подключение к интернету как для сотовой сети, так и для Wi-Fi. язык - Swift 3.0
источник
Для Swift 3 я не мог использовать только достижимость от решений RAJAMOHAN-S, так как она возвращает «true», если есть WiFi, но нет Интернета. Таким образом, я реализовал вторую проверку с помощью класса URLSession и обработчика завершения.
Здесь весь класс.
И вы называете это так, например:
источник
Это моя версия. По сути, это не приносит ничего нового. Я связал это с UIDevice.
источник
Теперь позвони
источник