Quando tento verificar uma conexão com a Internet no meu iPhone, recebo vários erros. Alguém pode me ajudar a consertar isso?
O código:
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
}
}
Os erros com o código:
Se estiver ilegível, o erro 1 diz:
'Int' não é conversível em 'SCNetworkReachabilityFlags'
Erro 2 e 3:
Não foi possível encontrar uma sobrecarga para 'init' que aceita os argumentos fornecidos
ios
swift
xcode
reachability
b3rge
fonte
fonte
Respostas:
Para resolver o problema 4G mencionado nos comentários, usei a implementação de acessibilidade @AshleyMills como referência e reescrevi a acessibilidade para o Swift 3.1:
atualizado: Xcode 10.1 • Swift 4 ou posterior
Arquivo Reachability.swift
Uso
Inicialize-o no método AppDelegate.swift didFinishLaunchingWithOptions e lide com os erros que possam ocorrer:
E uma amostra do controlador de exibição:
Projeto de exemplo
fonte
if SCNetworkReachabilityGetFlags(…)
xCode, pois retorna um Bool na versão mais recente.Para Swift 3, Swift 4 (trabalhando com celular e Wi-Fi):
Uso:
fonte
Crie um novo arquivo Swift dentro do seu projeto, nomeie-o
Reachability.swift
. Recorte e cole o código a seguir para criar sua classe.Você pode verificar a conexão à Internet em qualquer lugar do seu projeto usando este código:
Se o usuário não estiver conectado à Internet, você poderá exibir uma caixa de diálogo de alerta para notificá-lo.
Explicação:
Estamos criando uma classe pública reutilizável e um método que pode ser usado em qualquer lugar do projeto para verificar a conectividade com a Internet. Exigimos a adição das estruturas Foundation e System Configuration.
Na classe pública de alcançabilidade, o método
isConnectedToNetwork() -> Bool { }
retornará um valor booleano sobre conectividade à Internet. Usamos um loop if para executar as ações necessárias no caso. Espero que isso seja suficiente. Felicidades!fonte
Se alguém já estiver usando o Alamofire, então -
Uso:
fonte
Fiz uma verificação da implementação da classe de acessibilidade de Ashley Mill sem o Cocoa Pods / Dependancy Manager. A idéia é liberar a dependência de acessibilidade no projeto.
Xcode 7.2 - Swift 2.1
1) https://github.com/ashleymills/Reachability.swift . O download adiciona a classe de alcançabilidade ao projeto.
Nota: Ao adicionar, verifique se 'copiar itens se necessário' está marcado.
2) Faça uma classe AppManager.swift. Esta classe atenderá como classe de Modelo Público, onde métodos e dados públicos serão adicionados e podem ser utilizados em qualquer VC.
3) Faça uma classe de delegado. Eu uso o método delegado para notificar o status da conectividade.
4) Faça a classe Parent de UIViewController (método de herança). A classe pai possui métodos acessíveis a todos os VCs filhos.
5) Inicie o Monitoramento de conectividade à Internet em tempo real no AppDelegate.
6) Adicionei um AppReference de nome de arquivo Swift para armazenar valores de enumeração constantes.
7) No ViewController (por exemplo, você deseja chamar uma API apenas se a rede estiver disponível)
O exemplo pode ser baixado em https://github.com/alvinreuben/Reachability-Sample
Atualizado para o Swift 3.1- https://github.com/alvinvgeorge/Reachability-UpgradedToSwift3
fonte
A Apple introduziu o Network Framework no iOS12.
fonte
pathUpdateHandler
apresentará uma forte referência comself
, adicione[weak self]
para resolvê-lo :) #Use isso para o Swift-5 +
Uso:
Ou basta usar isso
framework
para maisUtilities
: Linkfonte
Só descobri isso por mim mesmo.
Xcode: 7.3.1, iOS 9.3.3
Usando ashleymills / Reachability.swift como Reachability.swift no meu projeto, criei a seguinte função:
Basta ligar para
hasConnectivity()
onde você precisar verificar a conexão. Isso funciona tanto para Wifi quanto para celular.Adicionando o Reachability.swift do ashleymills para que as pessoas não precisem se mover entre sites:
fonte
let reachability: Reachability = try Reachability.reachabilityForInternetConnection()
paralet reachability: Reachability = try Reachability()!
Embora não responda diretamente à sua pergunta, gostaria de mencionar que a Apple recentemente teve esta palestra:
https://developer.apple.com/videos/play/wwdc2018/714/
Por volta das 09:55, ele fala sobre fazer essas coisas que você está perguntando:
No entanto, isso tem algumas armadilhas:
Os seguintes pontos são algumas práticas recomendadas de acordo com a Apple:
waitsForConnectivity
como true ( https://developer.apple.com/documentation/foundation/urlsessionconfiguration/2908812-waitsforconnectivity )taskIsWaitingForConnectivity
( https://developer.apple.com/documentation/foundation/urlsessiontaskdelegate/2908819-urlsession ). Esta é a maneira recomendada pela Apple de verificar a conectividade, conforme mencionado no vídeo em 33:25.De acordo com a palestra, não deve haver nenhum motivo para verificar previamente se você tem conexão com a Internet ou não, pois pode não ser preciso no momento em que você envia sua solicitação ao servidor .
fonte
Eu fiz minha própria solução usando NSTimer e Alamofire:
O NSTimer é usado como tempo limite e foi usado devido a resultados não confiáveis usando o tempo limite Alamofire. A solicitação deve ser feita para um URL em que você confia, como seu próprio servidor ou o servidor que hospeda os serviços dos quais você depende.
Quando o cronômetro expira, a solicitação é cancelada e os resultados são retornados usando um manipulador de conclusão.
Uso:
fonte
requestTimeout()
seria chamado depois que o tempo limite especificado fosse atingido.Se você estiver usando o Alamofire, poderá fazer algo assim:
fonte
Swift 5
Em qualquer método, use a condição abaixo
fonte
aqui minha solução para o swift 2.3 com a lib ( Reachability.swift )
Entre no seu
Podfile
e adicione:Depois, no seu
terminal
:Em seguida, crie um novo arquivo
ReachabilityManager
e adicione o código abaixo:Como usá-lo:
entre no seu
AppDelegate.swift
e adicione o código abaixo:Então, quando você quiser verificar se o dispositivo está conectado à Internet, faça:
fonte
Embora possa não determinar diretamente se o telefone está conectado a uma rede, a solução mais simples (mais limpa?) Seria 'executar ping' no Google ou em outro servidor (o que não é possível, a menos que o telefone esteja conectado a uma rede) ):
Se você está preocupado com o fato de o servidor estar inativo ou bloquear seu IP, você sempre pode executar ping em vários servidores de maneira semelhante e retornar se algum deles é acessível. Ou peça a alguém que configure um servidor dedicado apenas para esse fim.
fonte
Com a ajuda do código abaixo, você pode verificar a conexão à Internet para a rede celular e também para o wifi. idioma - Swift 3.0
fonte
No Swift 3, eu não poderia usar apenas a acessibilidade das soluções RAJAMOHAN-S, pois ela retorna "true" se houver WiFi, mas não Internet. Assim, implementei a segunda validação via classe URLSession e manipulador de conclusão.
Aqui está toda a turma.
E você chama assim, por exemplo:
fonte
Esta é a minha versão. Essencialmente, não traz nada de novo. Liguei-o ao UIDevice.
fonte
Agora chame
fonte