Ich habe eine kommerzielle App, die einen völlig legitimen Grund hat, die SSID des Netzwerks zu sehen, mit dem sie verbunden ist: Wenn sie für ein Hardwaregerät eines Drittanbieters mit einem Adhoc-Netzwerk verbunden ist, muss sie anders funktionieren als sie ist mit dem Internet verbunden.
Alles, was ich über das Abrufen der SSID gesehen habe, sagt mir, dass ich Apple80211 verwenden muss, von dem ich verstehe, dass es eine private Bibliothek ist. Ich habe auch gelesen, dass Apple die App nicht genehmigt, wenn ich eine private Bibliothek verwende.
Bin ich zwischen einem Apfel und einem harten Ort festgefahren oder fehlt mir hier etwas?
Antworten:
Ab iOS 7 oder 8 können Sie dies tun (benötigen Sie die Berechtigung für iOS 12+, wie unten gezeigt):
Beispielausgabe:
Beachten Sie, dass vom Simulator keine Wenns unterstützt werden. Testen Sie auf Ihrem Gerät.
iOS 12
Sie müssen den Zugriff auf WLAN-Informationen über Funktionen aktivieren.
Swift 4.2
quelle
@import
anstelle von#import
) verwendet wurden. Clang verknüpft automatisch das erforderliche Framework, wenn ein Modul und nicht nur ein Header importiert wird.CNCopyCurrentNetworkInfo
, nützliche Informationen zurückzugeben, eine Standortberechtigung erforderlich . Andernfalls wird es zurückgegebennil
. Siehe: stackoverflow.com/questions/56583650/…Hier ist die bereinigte ARC-Version, die auf dem Code von @ elsurudo basiert:
quelle
UPDATE FÜR iOS 10 und höher
CNCopySupportedInterfaces ist in iOS 10 nicht mehr veraltet. ( API-Referenz )
Sie müssen SystemConfiguration / CaptiveNetwork.h importieren und SystemConfiguration.framework zu den verknüpften Bibliotheken Ihres Ziels hinzufügen (in Erstellungsphasen).
Hier ist ein Code-Snippet in Kürze (RikiRiocmas Antwort) :
( Wichtig: CNCopySupportedInterfaces gibt im Simulator null zurück.)
Für Ziel-c siehe Esads Antwort hier und unten
UPDATE FÜR iOS 9
Ab iOS 9 ist Captive Network veraltet *. ( Quelle )
* In iOS 10 nicht mehr veraltet, siehe oben.
Es wird empfohlen, NEHotspotHelper ( Quelle ) zu verwenden.
Sie müssen Apple eine E-Mail an [email protected] senden und Berechtigungen anfordern. ( Quelle )
Beispielcode ( Nicht mein Code. Siehe Antwort von Pablo A ):
Randnotiz: Ja, sie haben CNCopySupportedInterfaces in iOS 9 abgelehnt und ihre Position in iOS 10 umgekehrt. Ich habe mit einem Apple-Netzwerktechniker gesprochen, und die Umkehrung erfolgte, nachdem so viele Leute Radars eingereicht und in den Apple Developer-Foren über das Problem gesprochen hatten.
quelle
Dies funktioniert bei mir auf dem Gerät (nicht Simulator). Stellen Sie sicher, dass Sie das Systemkonfigurationsframework hinzufügen.
quelle
Dieser Code funktioniert gut, um die SSID zu erhalten.
Und das ist das Ergebnis:
}}
quelle
Wenn Sie iOS 12 ausführen, müssen Sie einen zusätzlichen Schritt ausführen. Ich habe mich bemüht, diesen Code zum Laufen zu bringen, und habe ihn schließlich auf Apples Website gefunden: "Wichtig Um diese Funktion in iOS 12 und höher zu verwenden, aktivieren Sie die Funktion zum Zugriff auf WLAN-Informationen für Ihre App in Xcode. Wenn Sie diese Funktion aktivieren, wird Xcode automatisch aktiviert Fügt Ihrer Berechtigungsdatei und App-ID die Berechtigung "Zugriff auf WiFi-Informationen" hinzu. " https://developer.apple.com/documentation/systemconfiguration/1614126-cncopycurrentnetworkinfo
quelle
Siehe CNCopyCurrentNetworkInfo in CaptiveNetwork: http://developer.apple.com/library/ios/#documentation/SystemConfiguration/Reference/CaptiveNetworkRef/Reference/reference.html .
quelle
Hier ist die kurze und süße Swift-Version.
Denken Sie daran, das Framework zu verknüpfen und zu importieren:
Definieren Sie die Methode:
Rufen Sie die Methode auf, wenn Sie sie benötigen:
Wie an anderer Stelle erwähnt, funktioniert dies nur auf Ihrem iDevice. Wenn nicht über WLAN, gibt die Methode null zurück - daher die Option.
quelle
Für iOS 13
Ab iOS 13 benötigt Ihre App auch Core Location-Zugriff, um die
CNCopyCurrentNetworkInfo
Funktion nutzen zu können, es sei denn, sie hat das aktuelle Netzwerk konfiguriert oder verfügt über VPN-Konfigurationen:Dies ist also das, was Sie benötigen (siehe Apple-Dokumentation ):
- Verknüpfen Sie die
CoreLocation.framework
Bibliothek- Hinzufügen
location-services
alsUIRequiredDeviceCapabilities
Schlüssel / Wert in Info.plist- Hinzufügen eines
NSLocationWhenInUseUsageDescription
Schlüssels / Werts in Info.plist, der beschreibt, warum Ihre App Core Location benötigt- Fügen Sie das "Access WiFi" hinzu Information "Berechtigung für Ihre App
Überprüfen Sie nun als Objective-C-Beispiel zunächst, ob der Standortzugriff akzeptiert wurde, bevor Sie die Netzwerkinformationen lesen
CNCopyCurrentNetworkInfo
:quelle