Dva chybové kódy vysvětlují většinu prvních pokusů o Network Extension VPN v iOS: NEVPNErrorDomain Code=4 a Code=5. Ani jeden není stížnost serveru. Jeden se objeví, když aplikace zapisuje nastavení do objektu, který se nikdy nepřečetl z disku, a druhý, když samotný zápis selže, nejčastěji proto, že se profil ukládá, dokud je ještě zakázaný. Oba se opravují změnou pořadí čtyř volání, ne zásahem do parametrů IKEv2.

Nejprve načtěte, jinak nemá uložení s čím srovnávat

Správce drží kopii uloženého profilu a objekt, který upravujete, není tou kopií, dokud ho nepřečtete. Zavolejte nejprve loadFromPreferences, upravujte uvnitř jeho obsluhy dokončení a potom uložte. Když čtení přeskočíte, rámec vidí nesoulad mezi tím, co má, a tím, co píšete. Ve Swiftu je tvar stejný pro každý krok a každý krok patří do vlastního closure:

let mgr = NEVPNManager.shared()
mgr.loadFromPreferences { loadErr in
    guard loadErr == nil else { return }
    let proto = NEVPNProtocolIKEv2()
    proto.serverAddress = "vpn.example.net"
    proto.username = "alice"
    proto.useExtendedAuthentication = true
    mgr.protocolConfiguration = proto
    mgr.isEnabled = true
    mgr.saveToPreferences { saveErr in
        // do not start here; reload, then connect
    }
}

Spuštění tunelu zevnitř closure pro uložení je stejná chyba na jiném místě. Běží dřív, než se profil znovu přečte, takže volání spuštění vidí stav, který jste postavili, a ne stav, který se uložil. Closure pro uložení končí druhým loadFromPreferences a jen tato obsluha dokončení volá startVPNTunnel.

Příznak povolení je součástí uložení

Uložený profil je nečinný, dokud se nezapne. Nastavte isEnabled = true ve stejném zápisu, jinak profil přistane na disku zakázaný a startVPNTunnel odmítne, i když Nastavení ukazují konfiguraci, která vypadá úplně.

Vnější úpravy jsou druhou polovinou. Pokud uživatel něco změní v Nastavení nebo se zařízení přesune mezi sítěmi, přečtěte znovu, než uvěříte hodnotám, které ještě držíte v paměti. Objekt tyto změny za vás nesleduje. Zastaralá kopie je způsob, jakým aplikace zapíše profil, který tiše vrátí uživatelovu úpravu. Dvě sousední pole způsobují tichý problém ve stejný okamžik: pravidla on-demand musí být pole objektů pravidel, ne prázdný zástupný prvek, a disconnectOnSleep má odrážet chování, které jste zvolili, ne zkopírovanou výchozí hodnotu.

Pro aplikace třetích stran jsou dostupné jen dva protokoly

Network Extension dává aplikacím IPsec a IKEv2. L2TP a PPTP zůstávají uvnitř systému, takže aplikace, která je potřebuje, je mít nemůže, a realistické odpovědi jsou brána s podporou IKEv2 nebo spravovaný konfigurační profil.

Přihlašovací údaje sledují stejný vzorec. Vložte heslo do Keychain a předejte trvalou referenci místo řetězce. Nulová reference při ukládání obvykle znamená, že vyhledání proběhlo dřív, než byla položka zapsána, a ne že je správce rozbitý.

Obě jsou rozhodnutí o návrhu, ne obchvaty. Aplikace, která drží heslo ve vlastních předvolbách, volí cestu, kterou rámec nedoporučuje, a selhání, které vytváří, se čte jako chyba ukládání.

Vylučte oprávnění, než začnete přepisovat kód

Když loadFromPreferences nikdy nezavolá zpět, pravděpodobnou příčinou je chybějící schopnost Network Extension nebo provisionovací profil, který ji nenese. Takové selhání visí místo toho, aby hlásilo chybu, a proto se fungující kód přepisuje hodiny. Zkontrolujte oprávnění v podepsaném sestavení, které hodláte dodat, protože běh v simulátoru a na zařízení se může lišit a cílem, na kterém záleží, je zařízení. Otevřete nastavení podepisování cíle a potvrďte, že schopnost Network Extension je přítomna pro přesně toto sestavení.

Provisionovací profil bez oprávnění selhává na hardwaru stejně, zatímco stejné sestavení se v simulátoru může načíst normálně. Otestujte podepsaný archiv na skutečném zařízení, než přepíšete pořadí volání.

Sledujte změny stavu, ne předpoklady

Sledujte NEVPNStatusDidChangeNotification a zaznamenávejte manager.connection.status po každém kroku. Stav, který nikdy neopustí invalid, znamená, že profil nebyl uložen nebo oprávnění chybí. Spojení, které dosáhne connecting a nikdy se nepřipojí, ukazuje na návrh nebo přihlašovací údaje, což je jiné vyšetřování s jinými důkazy.

Potvrďte, že se profil objevuje v Nastavení, Obecné, VPN, a zaznamenejte chybu z každého closure. Tato dvě fakta oddělují chybu pořadí od chyby oprávnění bez hádání.

Související články