NetworkExtension Swift: Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

NetworkExtension für Swift: Vollständige Anleitung zur Verwaltung von VPN und Netzwerkerweiterungen

1. Was ist NetworkExtension und wozu braucht man es?

NetworkExtension ist ein leistungsstarkes Framework von Apple, das Entwicklern Zugriff auf systemnahe Netzwerkfunktionen auf Geräten mit iOS, macOS, tvOS und watchOS bietet. Im Gegensatz zu normalen Apps, die in einer isolierten Sandbox laufen, ermöglicht NetworkExtension die Erstellung von Systemerweiterungen, die Netzwerkverkehr auf Betriebssystemebene abfangen, filtern, umleiten und verschlüsseln können. Es handelt sich nicht um eine Bibliothek im herkömmlichen Sinne (wie Alamofire oder Moya), sondern eher um eine Reihe von APIs zur Erstellung privilegierter Netzwerkprozesse.

Die Hauptanwendung von NetworkExtension ist die Entwicklung von VPN-Clients (einschließlich Protokolle wie IKEv2, IPSec, WireGuard und benutzerdefinierte), Content-Filtern (Kindersicherung, DNS-basierte Werbeblocker), Proxy-Servern und Tools zur Verkehrsüberwachung. Ohne dieses Framework ist die Implementierung eines vollwertigen VPNs auf Apple-Geräten ohne Jailbreak nicht möglich. Es wird auch von Unternehmens-Apps für den sicheren Zugriff auf interne Ressourcen genutzt.

Für die Bildungsseite PythonLib ist es wichtig zu verstehen, dass NetworkExtension ein natives Swift/Objective-C-Framework ist, das nicht über Paketmanager (pip, npm) installiert wird. Es ist Teil des Xcode SDKs und erfordert die Konfiguration spezieller Berechtigungen (Entitlements) sowie die Code-Signierung mit entsprechenden Capabilities. In diesem Artikel behandeln wir die Schlüsselkomponenten: NETunnelProviderManager, NEPacketTunnelProvider, NEVPNManager, NEFilterProvider und andere.

2. Einrichtung und Konfiguration

Da NetworkExtension Teil des systemeigenen SDKs ist, beschränkt sich die "Installation" auf die korrekte Konfiguration des Xcode-Projekts. Es sind keine Befehle wie pip install oder npm install erforderlich. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Erstellen Sie ein neues Projekt in Xcode (iOS oder macOS).
  2. Fügen Sie ein neues Target hinzu: File → New → Target. Wählen Sie "Network Extension" aus der Liste. Sie werden aufgefordert, den Erweiterungstyp zu wählen: Packet Tunnel Provider (für benutzerdefinierte VPNs), Filter Data Provider (für Filterung), DNS Proxy usw.
  3. Entitlements konfigurieren: Öffnen Sie im Hauptprojekt (nicht in der Erweiterung) die Datei .entitlements und fügen Sie den Schlüssel com.apple.developer.networking.vpn.api mit dem Wert allow hinzu. Für einige Funktionen (z. B. Filterung) kann com.apple.developer.networking.networkextension erforderlich sein.
  4. App ID und Provisioning Profile: Erstellen Sie in der Apple Developer Console eine App ID mit aktivierter "Network Extensions"-Fähigkeit. Laden Sie ein neues Provisioning Profile herunter und installieren Sie es, das diese Fähigkeit enthält.
  5. Code-Signierung: Stellen Sie sicher, dass sowohl die Haupt-App als auch die Erweiterung mit demselben Zertifikat und Profil signiert sind.

Danach können Sie das Modul im Code der Erweiterung importieren:

import NetworkExtension

Für die Haupt-App (die die Erweiterung verwaltet) muss dieses Modul ebenfalls importiert werden.

3. Schnellstart: Minimales funktionsfähiges Beispiel (VPN)

Wir erstellen einen einfachen VPN-Client, der eine Verbindung zu einem Server herstellt. Dieser Code wird im Packet Tunnel Provider (der Erweiterung) ausgeführt.

import NetworkExtension

class PacketTunnelProvider: NEPacketTunnelProvider {

    override func startTunnel(options: [String : NSObject]? = nil) async throws {
        // Konfiguration der Tunnelparameter
        let tunnelNetworkSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "192.168.1.1")
        tunnelNetworkSettings.mtu = 1400
        
        // DNS-Konfiguration
        let dnsSettings = NEDNSSe                    

Empfehlungen