NEVPNManager kaydetmiyor mu? Sıra: yükle, etkinleştir, kaydet, bağlan
Kod 4 ve kod 5 genellikle profilin yüklenmeden önce düzenlendiği veya devre dışıyken kaydedildiği anlamına gelir. Çağrı sırasını düzeltin, ardından yetkiyi kontrol edin.
iOS'ta Network Extension VPN ile ilk denemelerin çoğunu iki hata kodu açıklar: NEVPNErrorDomain Code=4 ve Code=5. İkisi de sunucu şikâyeti değildir. Biri uygulama, diskten hiç okunmamış bir nesneye ayar yazdığında, diğeri yazmanın kendisi başarısız olduğunda görünür; çoğunlukla profil hâlâ devre dışıyken kaydedildiği için. İkisi de dört çağrının sırasını değiştirerek düzelir, IKEv2 parametrelerine dokunarak değil.
Önce yükleyin, yoksa kaydetmenin karşılaştıracağı bir şey yoktur
Yönetici, kaydedilmiş profilin bir kopyasını tutar ve düzenlediğiniz nesne, onu okuyana kadar o kopya değildir. Önce loadFromPreferences çağırın, tamamlama işleyicisinin içinde düzenleyin, sonra kaydedin. Okumayı atlarsanız çerçeve, elindekiyle yazdığınız arasında bir uyuşmazlık görür. Swift'te biçim her adımda aynıdır ve her adım kendi closure'ına aittir:
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
}
}
Tüneli kaydetme closure'ının içinden başlatmak, aynı hatanın başka bir yeridir. Profil yeniden okunmadan önce çalışır, bu yüzden başlatma çağrısı kaydedilen durumu değil sizin kurduğunuz durumu görür. Kaydetme closure'ı ikinci bir loadFromPreferences ile biter ve yalnızca o tamamlama işleyicisi startVPNTunnel çağırır.
Etkinleştirme bayrağı kaydetmenin bir parçasıdır
Kaydedilmiş bir profil açılana kadar etkisizdir. isEnabled = true değerini aynı yazmada ayarlayın, yoksa profil diske devre dışı iner ve Ayarlar tam görünen bir yapılandırma gösterse bile startVPNTunnel reddeder.
Dış düzenlemeler bunun diğer yarısıdır. Kullanıcı Ayarlar'da bir şey değiştirirse veya cihaz ağlar arasında geçerse, bellekte hâlâ tuttuğunuz değerlere güvenmeden önce yeniden okuyun. Nesne bu değişiklikleri sizin için izlemez. Eskimiş kopya, bir uygulamanın kullanıcının düzenlemesini sessizce geri alan bir profil yazma yoludur. Yan yana iki alan aynı anda sessiz sorun çıkarır: on-demand kuralları boş bir yer tutucu değil, kural nesnelerinden oluşan bir dizi olmalıdır ve disconnectOnSleep kopyalanmış bir varsayılanı değil, seçtiğiniz davranışı yansıtmalıdır.
Üçüncü taraf uygulamalar için yalnızca iki protokol vardır
Network Extension uygulamalara IPsec ve IKEv2 verir. L2TP ve PPTP sistemin içinde kalır, bu yüzden bunlara ihtiyaç duyan bir uygulama onları alamaz ve gerçekçi yanıtlar IKEv2 destekli bir geçit veya yönetilen yapılandırma profilidir.
Kimlik bilgileri aynı kalıbı izler. Parolayı Keychain'e koyun ve dize yerine kalıcı bir referans geçirin. Kaydetme sırasında boş referans genellikle aramanın öğe yazılmadan önce çalıştığı anlamına gelir, yöneticinin bozuk olduğu değil.
İkisi de geçici çözüm değil tasarım kararıdır. Parolayı kendi tercihlerinde tutan uygulama, çerçevenin önermediği bir yolu seçer ve ürettiği hata kaydetme hatası gibi okunur.
Kodu yeniden yazmadan önce yetkiyi eleyin
loadFromPreferences hiç geri çağırma yapmıyorsa, olası neden eksik bir Network Extension yeteneği veya onu taşımayan bir hazırlık profilidir. Bu hata hata vermek yerine asılı kalır ve bu yüzden çalışan kod saatlerce yeniden yazılır. Göndermeyi planladığınız imzalı yapıdaki yetkiyi kontrol edin, çünkü simülatör koşusu ile cihaz koşusu farklı olabilir ve önemli olan hedef cihazdır. Hedefin imzalama ayarlarını açın ve Network Extension yeteneğinin tam o yapı için var olduğunu doğrulayın.
Yetkisi olmayan bir hazırlık profili donanımda aynı şekilde başarısız olur, oysa aynı yapı simülatörde normal yüklenebilir. Çağrı sırasını yeniden yazmadan önce imzalı arşivi gerçek bir cihazda test edin.
Varsayımları değil durum değişikliklerini izleyin
NEVPNStatusDidChangeNotification'ı izleyin ve her adımdan sonra manager.connection.status değerini kaydedin. invalid durumundan hiç çıkmayan bir durum, profilin kaydedilmediği veya yetkinin olmadığı anlamına gelir. connecting'e ulaşıp hiç bağlanmayan bir bağlantı, öneriye veya kimlik bilgilerine işaret eder ve bu, farklı kanıtlarla yapılan farklı bir araştırmadır.
Profilin Ayarlar, Genel, VPN altında göründüğünü doğrulayın ve her closure'ın hatasını not edin. Bu iki gerçek, tahmin etmeden sıra hatasını izin hatasından ayırır.