Dua kode kesalahan menjelaskan sebagian besar percobaan pertama VPN Network Extension di iOS: NEVPNErrorDomain Code=4 dan Code=5. Keduanya bukan keluhan server. Yang satu muncul saat aplikasi menulis pengaturan ke objek yang belum pernah dibaca dari disk, dan yang lain saat penulisan itu sendiri gagal, paling sering karena profil disimpan selagi masih dinonaktifkan. Keduanya diperbaiki dengan mengubah urutan empat panggilan, bukan dengan menyentuh parameter IKEv2.

Muat dulu, atau penyimpanan tidak punya pembanding

Manajer menyimpan salinan profil tersimpan, dan objek yang Anda edit bukan salinan itu sampai Anda membacanya. Panggil loadFromPreferences lebih dulu, edit di dalam handler penyelesaiannya, lalu simpan. Lewatkan pembacaan dan framework melihat ketidakcocokan antara yang dimilikinya dan yang Anda tulis. Di Swift bentuknya sama untuk setiap langkah, dan setiap langkah berada di closure-nya sendiri:

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
    }
}

Memulai tunnel dari dalam closure penyimpanan adalah kesalahan yang sama di tempat lain. Itu berjalan sebelum profil dibaca ulang, jadi panggilan mulai melihat keadaan yang Anda bangun, bukan keadaan yang tersimpan. Closure penyimpanan berakhir dengan loadFromPreferences kedua, dan hanya handler penyelesaian itu yang memanggil startVPNTunnel.

Flag aktivasi adalah bagian dari penyimpanan

Profil tersimpan tidak aktif sampai dinyalakan. Setel isEnabled = true dalam penulisan yang sama, atau profil mendarat di disk dalam keadaan nonaktif dan startVPNTunnel menolak meski Pengaturan menampilkan konfigurasi yang tampak lengkap.

Editan eksternal adalah separuh lainnya. Jika pengguna mengubah sesuatu di Pengaturan, atau perangkat berpindah antarjaringan, baca ulang sebelum memercayai nilai yang masih Anda pegang di memori. Objek tidak mengamati perubahan itu untuk Anda. Salinan basi adalah cara aplikasi menulis profil yang diam-diam mengembalikan editan pengguna. Dua bidang yang berdekatan menimbulkan masalah senyap pada saat yang sama: aturan on-demand harus berupa larik objek aturan, bukan plaseholder kosong, dan disconnectOnSleep harus mencerminkan perilaku yang Anda pilih, bukan nilai bawaan yang disalin.

Hanya dua protokol tersedia untuk aplikasi pihak ketiga

Network Extension memberi aplikasi IPsec dan IKEv2. L2TP dan PPTP tetap di dalam sistem, jadi aplikasi yang membutuhkannya tidak bisa memilikinya, dan jawaban realistisnya adalah gateway yang mendukung IKEv2 atau profil konfigurasi terkelola.

Kredensial mengikuti pola yang sama. Taruh kata sandi di Keychain dan berikan referensi persisten alih-alih string. Referensi nol saat menyimpan biasanya berarti pencarian berjalan sebelum item ditulis, bukan bahwa manajer rusak.

Keduanya keputusan desain, bukan akal-akalan. Aplikasi yang menyimpan kata sandi di preferensinya sendiri memilih jalur yang tidak dianjurkan framework, dan kegagalan yang dihasilkannya terbaca seperti kesalahan penyimpanan.

Singkirkan entitlement sebelum menulis ulang kode

Ketika loadFromPreferences tidak pernah memanggil balik sama sekali, penyebab yang mungkin adalah kemampuan Network Extension yang hilang atau profil provisioning yang tidak membawanya. Kegagalan itu menggantung alih-alih memberi kesalahan, dan itulah sebabnya kode yang berfungsi ditulis ulang berjam-jam. Periksa entitlement pada build bertanda tangan yang akan Anda kirim, karena jalan di simulator dan jalan di perangkat bisa berbeda dan target yang penting adalah perangkat. Buka pengaturan penandatanganan target dan pastikan kemampuan Network Extension ada untuk build yang tepat itu.

Profil provisioning tanpa entitlement gagal dengan cara yang sama di perangkat keras, sementara build yang sama bisa dimuat normal di simulator. Uji arsip bertanda tangan di perangkat nyata sebelum menulis ulang urutan panggilan.

Amati perubahan status, bukan asumsi

Amati NEVPNStatusDidChangeNotification dan catat manager.connection.status setelah setiap langkah. Status yang tidak pernah meninggalkan invalid berarti profil tidak tersimpan atau entitlement tidak ada. Koneksi yang mencapai connecting dan tidak pernah tersambung menunjuk ke proposal atau kredensial, yang merupakan penyelidikan lain dengan bukti lain.

Pastikan profil muncul di Pengaturan, Umum, VPN, dan catat kesalahan dari setiap closure. Dua fakta itu memisahkan bug urutan dari bug izin tanpa menebak.

Artikel terkait