Sei que essa pergunta parecerá um engodo de muitas outras, no entanto, não acho que o caso simples seja bem explicado aqui. Vindo de um plano de fundo Android e BlackBerry, fazer solicitações através de HTTPUrlConnection
falha instantânea se não houver conexão disponível. Parece um comportamento completamente sensato, e fiquei surpreso ao descobrir que NSURLConnection
no iOS não o emulei.
Entendo que a Apple (e outras pessoas que a estenderam) forneça uma Reachability
classe para ajudar na determinação do estado da rede. Fiquei feliz em ver isso pela primeira vez e esperava ver algo parecido bool isNetworkAvailable()
, mas, para minha surpresa, encontrei um sistema complexo que exigia registros de notificação e retornos de chamada, além de vários detalhes aparentemente desnecessários. Deve haver uma maneira melhor.
Meu aplicativo já lida com falhas de conexão, incluindo nenhuma conectividade. O usuário é notificado da falha e o aplicativo segue em frente.
Portanto, meus requisitos são simples: Função única e síncrona que eu posso chamar antes de todas as solicitações HTTP para determinar se devo realmente enviar a solicitação ou não. Idealmente, não requer configuração e retorna apenas um booleano.
Isso realmente não é possível no iOS?
fonte
Respostas:
Eu fiz um pouco mais de pesquisa e estou atualizando minha resposta com uma solução mais atual. Não tenho certeza se você já olhou para ele, mas há um bom código de exemplo fornecido pela Apple.
Faça o download do código de exemplo aqui
Inclua os arquivos Reachability.he Reachability.m em seu projeto. Dê uma olhada em ReachabilityAppDelegate.m para ver um exemplo de como determinar a acessibilidade do host, a acessibilidade por WiFi, pela WWAN etc. Para uma verificação muito simples da acessibilidade da rede, você pode fazer algo como isto
@ BenjaminPiette's: Não se esqueça de adicionar SystemConfiguration.framework ao seu projeto.
fonte
Como esse segmento é o principal resultado do Google para esse tipo de pergunta, achei que forneceria a solução que funcionou para mim. Eu já estava usando o AFNetworking , mas a pesquisa não revelou como realizar essa tarefa com o AFNetworking até a metade do meu projeto.
O que você deseja é o AFNetworkingReachabilityManager .
Você também pode usar o seguinte para testar a acessibilidade de forma síncrona (depois que o monitoramento for iniciado):
fonte
AFNetworkReachabilityManager
luz!AFNetworkReachabilityManager.reachable
NÃO realiza nenhum tipo de verificação síncrona. Retorna um lógico ou dereachableViaWWAN
ereachableViaWifi
.Desculpe por responder tarde demais, mas espero que esta resposta possa ajudar alguém no futuro.
A seguir, um pequeno trecho de código C nativo que pode verificar a conectividade com a Internet sem nenhuma classe extra.
Adicione os seguintes cabeçalhos:
Código:
Swift 3
fonte
Atualmente, uso esse método síncrono simples que não requer arquivos extras em seus projetos ou delegados.
Importar:
Crie este método:
Então, se você colocou isso em um
MyNetworkClass
:Se você estiver testando no simulador, ligue e desligue o wifi do seu Mac, pois parece que o simulador ignorará a configuração do telefone.
Atualizar:
No final, usei um retorno de chamada encadeado / assíncrono para evitar o bloqueio do encadeamento principal; e testando regularmente para que eu pudesse usar um resultado em cache - embora você deva evitar manter as conexões de dados desnecessariamente abertas.
Como o @thunk descreveu, existem URLs melhores para usar, que a própria Apple usa. http://cadinc.com/blog/why-your-apple-ios-7-device-wont-connect-to-the-wifi-network
fonte
www.apple.com
é grande o website ... a opção melhor seráwww.google.com
www.appleiphonecell.com
supostamente está disponível estritamente para esse fim e, aparentemente, não está bloqueado na China.É possível e é realmente simples se você olhar para ela ao concluir a implementação, o que é novamente - muito simples, pois os únicos itens necessários são duas variáveis booleanas: acessibilidade na Internet e acessibilidade no host (geralmente você precisa de mais de um deles). ) Depois de montar sua classe auxiliar que pode determinar o status das conexões, você realmente não se importa mais com a implementação necessária para conhecer esses procedimentos.
Exemplo:
E o arquivo .m:
fonte
Alguém já resolveu isso de uma maneira simples e reutilizável antes.
DDGReachability
.EDIT: Or
tonymillion/Reachability
.fonte
Eu extraí o código e coloquei em um único método, espero que ajude outros.
...
fonte
Estou escrevendo a versão rápida da resposta aceita aqui , caso alguém ache útil, o código está escrito rapidamente 2,
Você pode baixar os arquivos necessários do SampleCode
Adicione
Reachability.h
eReachability.m
arquive no seu projeto,Agora, será necessário criar um
Bridging-Header.h
arquivo, se não houver nenhum para o seu projeto,Dentro do seu
Bridging-Header.h
arquivo, adicione esta linha:Agora, a fim de verificar a conexão com a Internet
fonte
Eu acho que isso poderia ajudar ..
fonte
Você também pode tentar este caso já tenha configurado o AFNetworking em seu projeto.
fonte
Aqui está uma boa solução para verificar a conectividade usando o Swift, sem usar a acessibilidade. Encontrei-o neste blog .
Crie um novo arquivo Swift no seu projeto chamado
Network.swift
(por exemplo). Cole este código dentro desse arquivo:Em seguida, você pode verificar a conectividade em qualquer lugar do seu projeto usando:
fonte
EDIT: Isso não funcionará para URLs da rede (ver comentários)
No iOS 5, existe um novo método de instância NSURL:
Aponte para o site de seu interesse ou para apple.com; Eu acho que é a nova chamada de uma linha para ver se a Internet está funcionando no seu dispositivo.
fonte
Também não estava satisfeito com as opções de verificação da Internet disponíveis (por que essa API não é nativa?!?!)
Meu próprio problema foi com 100% de perda de pacotes - quando um dispositivo está conectado ao roteador, mas o roteador não está conectado à Internet. A acessibilidade e outros permanecerão suspensos por muito tempo. Eu criei uma classe de utilitário singleton para lidar com isso, adicionando um tempo limite assíncrono. Funciona bem no meu aplicativo. Espero que ajude. Aqui está o link no github:
https://github.com/fareast555/TFInternetChecker
fonte
Verificando a disponibilidade da conexão com a Internet no (iOS) Xcode 8.2, Swift 3.0
fonte
Substituição da acessibilidade da Apple reescrita em Swift com fechamentos , inspirada no tonymillion: https://github.com/ashleymills/Reachability.swift
Solte o arquivo
Reachability.swift
em seu projeto. Como alternativa, use CocoaPods ou Carthage - consulte a seção Instalação do README do projeto.Receba notificações sobre conectividade de rede:
e para interromper as notificações
fonte
Alamofire
Se você já está usando o Alamofire para todas as APIs RESTful, aqui está o que você pode se beneficiar disso.
Você pode adicionar a seguinte classe ao seu aplicativo e ligar
MNNetworkUtils.main.isConnected()
para obter um valor booleano se está conectado ou não.Esta é uma classe singleton. Sempre que o usuário conectar ou desconectar a rede, ela será substituída
self.reachable
por verdadeira / falsa corretamente, porque começamos a ouvir aNetworkReachabilityManager
inicialização on singleton.Também para monitorar a acessibilidade, você precisa fornecer um host. Atualmente, estou usando a
google.com
vontade para mudar para outros hosts ou um dos seus, se necessário.fonte