Mam komercyjną aplikację, która ma całkowicie uzasadniony powód, aby zobaczyć identyfikator SSID sieci, z którą jest połączona: Jeśli jest podłączona do sieci Adhoc urządzenia innej firmy, musi działać w inny sposób niż gdyby była Podłączony do internetu.
Wszystko, co widziałem na temat uzyskiwania identyfikatora SSID, mówi mi, że muszę używać Apple80211, co, jak rozumiem, jest prywatną biblioteką. Przeczytałem też, że jeśli korzystam z prywatnej biblioteki, Apple nie zatwierdzi aplikacji.
Czy utknąłem między jabłkiem a trudnym miejscem, czy jest coś, czego tu brakuje?
Odpowiedzi:
Od iOS 7 lub 8 możesz to zrobić (potrzebujesz uprawnienia dla iOS 12+, jak pokazano poniżej):
Przykładowe dane wyjściowe:
Należy pamiętać, że symulator nie obsługuje żadnych funkcji if. Przetestuj na swoim urządzeniu.
iOS 12
Musisz włączyć dostęp do informacji o Wi-Fi z funkcji.
Swift 4.2
źródło
@import
zamiast#import
). Clang automatycznie połączy się w wymaganej strukturze, gdy importowany jest moduł, a nie tylko nagłówek.CNCopyCurrentNetworkInfo
zwracania przydatnych informacji; w przeciwnym razie wracanil
. Zobacz: stackoverflow.com/questions/56583650/…Oto oczyszczona wersja ARC oparta na kodzie @ elsurudo:
źródło
AKTUALIZACJA DLA iOS 10 i nowszych
CNCopySupportedInterfaces nie jest już przestarzałe w iOS 10. (dokumentacja API )
Musisz zaimportować SystemConfiguration / CaptiveNetwork.h i dodać SystemConfiguration.framework do połączonych bibliotek celu (w fazie kompilacji).
Oto fragment kodu w języku swift (odpowiedź RikiRiocmy) :
( Ważne: CNCopySupportedInterfaces zwraca zero na symulatorze).
W przypadku Objective-c zobacz odpowiedź Esada tutaj i poniżej
AKTUALIZACJA DLA iOS 9
Od wersji iOS 9 Captive Network jest przestarzała *. ( źródło )
* Nie jest już przestarzała w iOS 10, patrz wyżej.
Zaleca się używanie NEHotspotHelper ( źródło )
Będziesz musiał wysłać e-mail do Apple na adres [email protected] i poprosić o uprawnienia. ( źródło )
Przykładowy kod (to nie mój kod. Zobacz odpowiedź Pablo A ):
Uwaga boczna: tak, wycofali oni CNCopySupportedInterfaces w iOS 9 i odwrócili swoje stanowisko w iOS 10. Rozmawiałem z inżynierem sieciowym Apple i odwrócenie nastąpiło po tym, jak wiele osób złożyło radary i wypowiedziało się o problemie na forach Apple Developer.
źródło
To działa dla mnie na urządzeniu (nie na symulatorze). Upewnij się, że dodajesz strukturę konfiguracji systemu.
źródło
Ten kod działa dobrze, aby uzyskać identyfikator SSID.
A oto wyniki:
}
źródło
Jeśli korzystasz z iOS 12, musisz wykonać dodatkowy krok. Zmagałem się, aby ten kod działał i w końcu znalazłem to w witrynie Apple: „Ważne Aby korzystać z tej funkcji w systemie iOS 12 i nowszych, włącz funkcję Dostęp do informacji o sieci Wi-Fi dla swojej aplikacji w Xcode. Po włączeniu tej funkcji Xcode automatycznie dodaje uprawnienie Access WiFi Information do pliku uprawnień i identyfikatora aplikacji ”. https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
źródło
Zobacz CNCopyCurrentNetworkInfo w CaptiveNetwork: http://developer.apple.com/library/ios/#documentation/SystemConfiguration/Reference/CaptiveNetworkRef/Reference/reference.html .
źródło
Oto krótka i słodka wersja Swift.
Pamiętaj, aby połączyć i zaimportować Framework:
Określ metodę:
Wywołaj metodę, kiedy jej potrzebujesz:
Jak wspomniano w innym miejscu, działa to tylko na twoim iDevice. Gdy nie ma Wi-Fi, metoda zwróci zero - stąd opcja.
źródło
W przypadku iOS 13
Począwszy od iOS 13, Twoja aplikacja potrzebuje również dostępu do lokalizacji podstawowej, aby móc korzystać z tej
CNCopyCurrentNetworkInfo
funkcji, chyba że skonfigurowała bieżącą sieć lub ma konfiguracje VPN:Oto, czego potrzebujesz (zobacz dokumentację Apple ):
- Połącz
CoreLocation.framework
bibliotekę- Dodaj
location-services
jakoUIRequiredDeviceCapabilities
klucz / wartość w Info.plist- Dodaj
NSLocationWhenInUseUsageDescription
klucz / wartość w Info.plist opisując, dlaczego Twoja aplikacja wymaga lokalizacji podstawowej- Dodaj „Dostęp do WiFi Uprawnienie do informowania o Twojej aplikacji
Teraz, jako przykład Objective-C, najpierw sprawdź, czy dostęp do lokalizacji został zaakceptowany przed odczytaniem informacji o sieci za pomocą
CNCopyCurrentNetworkInfo
:źródło