Eu tenho um aplicativo comercial que tem uma razão completamente legítima para ver o SSID da rede à qual está conectado: Se estiver conectado a uma rede Adhoc para um dispositivo de hardware de terceiros, ele precisará estar funcionando de maneira diferente da que está. Conectado a internet.
Tudo o que vi sobre a obtenção do SSID me diz que tenho que usar o Apple80211, o que entendo ser uma biblioteca privada. Também li que, se eu usar uma biblioteca privada, a Apple não aprovará o aplicativo.
Estou preso entre uma Apple e um lugar difícil ou há algo que estou perdendo aqui?
Respostas:
A partir do iOS 7 ou 8, você pode fazer isso (é necessário o Titular for iOS 12+, conforme mostrado abaixo):
Exemplo de saída:
Observe que nenhum ifs é suportado no simulador. Teste no seu dispositivo.
iOS 12
Você deve habilitar o acesso a informações wifi a partir dos recursos.
Swift 4.2
fonte
@import
vez de#import
). O Clang vinculará automaticamente a estrutura necessária quando um módulo, em vez de apenas um cabeçalho, for importado.CNCopyCurrentNetworkInfo
retornar informações úteis; caso contrário, ele retornanil
. Veja: stackoverflow.com/questions/56583650/…Aqui está a versão limpa do ARC, com base no código do @ elsurudo:
fonte
ATUALIZAÇÃO PARA iOS 10 e superior
CNCopySupportedInterfaces não é mais reprovado no iOS 10. ( Referência da API )
Você precisa importar SystemConfiguration / CaptiveNetwork.he adicionar SystemConfiguration.framework às Bibliotecas vinculadas do seu destino (nas fases de construção).
Aqui está um trecho de código no swift (resposta de RikiRiocma) :
( Importante: CNCopySupportedInterfaces retorna nulo no simulador.)
Para o Objective-c, veja a resposta de Esad aqui e abaixo
ATUALIZAÇÃO PARA iOS 9
A partir do iOS 9, o Captive Network está obsoleto *. ( fonte )
* Não é mais descontinuado no iOS 10, veja acima.
É recomendável que você use NEHotspotHelper ( origem )
Você precisará enviar um e-mail para a apple em [email protected] e solicitar direitos. ( fonte )
Código de exemplo ( não é meu código. Veja a resposta de Pablo A ):
Nota lateral: Sim, eles preteriram o CNCopySupportedInterfaces no iOS 9 e reverteram sua posição no iOS 10. Conversei com um engenheiro de rede da Apple e a reversão ocorreu depois que tantas pessoas arquivaram Radares e falaram sobre o problema nos fóruns de desenvolvedores da Apple.
fonte
Isso funciona para mim no dispositivo (não no simulador). Certifique-se de adicionar a estrutura de configuração do sistema.
fonte
Esse código funciona bem para obter o SSID.
E este é o resultado:
}
fonte
Se você estiver executando o iOS 12, precisará executar uma etapa extra. Eu tenho me esforçado para fazer esse código funcionar e finalmente o encontrei no site da Apple: "Importante Para usar esta função no iOS 12 e posterior, ative o recurso Acessar informações de WiFi para seu aplicativo no Xcode. Quando você habilita esse recurso, o Xcode automaticamente adiciona o direito de acesso às informações de WiFi ao seu arquivo de direitos e ID do aplicativo ". https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
fonte
Consulte CNCopyCurrentNetworkInfo em CaptiveNetwork: http://developer.apple.com/library/ios/#documentation/SystemConfiguration/Reference/CaptiveNetworkRef/Reference/reference.html .
fonte
Aqui está a versão curta e doce do Swift.
Lembre-se de vincular e importar o Framework:
Defina o método:
Chame o método quando precisar:
Como mencionado em outro lugar, isso funciona apenas no seu iDevice. Quando não estiver no WiFi, o método retornará nulo - daí o opcional.
fonte
Para iOS 13
A partir do iOS 13, seu aplicativo também precisa de acesso ao Local Principal para usar a
CNCopyCurrentNetworkInfo
função, a menos que tenha configurado a rede atual ou possua configurações de VPN:Portanto, é isso que você precisa (consulte a documentação da Apple ):
- Vincule a
CoreLocation.framework
biblioteca- Adicione
location-services
como umaUIRequiredDeviceCapabilities
chave / valor no Info.plist- Adicione uma
NSLocationWhenInUseUsageDescription
chave / valor no Info.plist descrevendo por que seu aplicativo exige a localização principal- adicione o "Access WiFi Informações "para o seu aplicativo
Agora, como um exemplo de Objective-C, verifique primeiro se o acesso ao local foi aceito antes de ler as informações da rede usando
CNCopyCurrentNetworkInfo
:fonte