Saat Anda membangun layar VPN di dalam aplikasi iOS, kejutan pertama adalah bahwa daftar protokol aplikasi Pengaturan bukanlah daftar API. Framework Network Extension memungkinkan aplikasi Anda membuat satu konfigurasi VPN pribadi, milik aplikasi itu, dan hanya menerima beberapa objek protokol. Semua hal lain yang orang harapkan, dari L2TP hingga profil yang diunduh, berada di luar permukaan itu atau bersifat privat bagi Apple. Kegagalan yang menyusul biasanya bukan bug, itu API yang menolak pekerjaan yang tidak pernah diberikan kepadanya.

Mitos: API adalah editor Pengaturan

Ada anggapan bahwa karena iOS dapat mengonfigurasi profil IKEv1, IKEv2, L2TP, dan IPsec, sebuah aplikasi dapat membuat salah satunya secara programatik. Tidak bisa. Framework mengekspos tepat satu slot konfigurasi kepada aplikasi pemanggil, dan slot itu hanya menerima sekumpulan kecil kelas protokol publik. Semua hal lain yang orang harapkan, dari L2TP hingga profil yang diunduh, berada di luar permukaan itu atau bersifat privat bagi Apple.

Kegagalan yang menyusul biasanya bukan bug. Itu API yang menolak pekerjaan yang tidak pernah diberikan kepadanya, dan perbaikannya adalah merancang layar di sekitar apa yang dimiliki API.

Tiga objek protokol dan yang tidak ada

Pilihan Anda adalah IKEv1 melalui NEVPNProtocolIPSec, IKEv2 melalui NEVPNProtocolIKEv2, dan NETunnelProviderProtocol jika Anda mengirim ekstensi tunnel paket sendiri. Referensi NEVPNManager mencantumkan objek protokol yang diterima. L2TP dan PPTP tidak pernah muncul dalam daftar itu karena Apple tidak menerbitkan kelas untuk keduanya. Mencoba salah satunya berakhir saat menyimpan dengan kesalahan, atau lebih buruk, dengan konfigurasi yang diam-diam menolak digunakan oleh sistem.

Kode desktop mengikuti aturan berbeda. Di macOS, SCNetworkInterfaceCreateWithInterface menumpuk tipe antarmuka seperti L2TP di atas IPv4 dan melampirkannya ke layanan jaringan, dan networksetup -connectpppoeservice memulai hasilnya. Diperlukan hak administrator dan alat bantu, karena rahasia bersama dan kata sandi masuk ke keychain sistem. Salin desain itu ke iOS dan tidak ada yang dikompilasi.

Berikan referensi keychain, bukan kata sandi

Tidak ada kelas IKE yang menerima kata sandi sebagai teks. Dua properti passwordReference dan sharedSecretReference menginginkan referensi keychain persisten, yang Anda peroleh dari SecItemCopyMatching dengan meminta kSecReturnPersistentRef. Meneruskan data item, atau memasukkan string ke kolom, menghasilkan kegagalan penyimpanan atau koneksi dengan kredensial kosong. Referensi hanya sekuat item keychain di belakangnya, itulah sebabnya item harus ada sebelum konfigurasi dirakit. Buatlah dalam transaksi yang sama dengan penyimpanan dan Anda menghapus seluruh kelas bug pengurutan.

Autentikasi sertifikat mengambil jalur lain: identityData plus identityDataPassword untuk blob PKCS#12. Mengirim blob itu di dalam bundel aplikasi adalah kebiasaan yang diwarisi dari kode contoh, bukan keputusan rilis, karena kata sandi ikut bepergian dan setiap salinan aplikasi membawa identitas yang sama.

Hak dan ketersediaan menggerbangi segalanya

Manajer mungkin tidak ada sama sekali, dan alasannya adalah provisioning. Pengenal aplikasi Anda membutuhkan kemampuan Network Extension bersama hak VPN pribadi, dan profil yang menandatangani build harus membawa keduanya.

Lewatkan itu dan instans bersama mengembalikan nil, atau penyimpanan gagal dengan kesalahan yang tidak pernah menyebut hak. Ketersediaan adalah gerbang lainnya. Targetkan apa pun yang lebih lama dari iOS 8 dan simbolnya hilang saat runtime, jadi kegagalannya adalah crash atau manajer nil, bukan manajer tanpa konfigurasi. Periksa runtime dan hak sebelum men-debug grafik objek Anda.

Muat, ubah, simpan, lalu perhatikan urutan sesuai permintaan

Perlakukan siklus hidup sebagai muat, ubah, simpan, dan jangan pernah melewati pemuatan. Sampai loadFromPreferences selesai, manajer tidak memegang apa pun dan objek protokol tidak dapat dibaca atau ditukar.

Penyimpanan kedua menggantikan konfigurasi alih-alih menambahkan yang lain, jadi penyimpanan yang belum selesai dapat merusak profil yang berfungsi. Aturan sesuai permintaan membentuk larik terurut, dan urutan itulah kebijakannya. Letakkan aturan hubungkan-dari-mana-saja di depan aturan putuskan dan pemutusan manual diikuti penyambungan ulang segera, yang terlihat seperti cacat tetapi mengikuti evaluasi yang didokumentasikan.

Pindahkan aturan putuskan ke depan saat tindakan pengguna harus menang. Apa yang tersisa di luar kendali aplikasi sama pentingnya. Rute datang dari tunnel atau kebijakan server alih-alih dari preferensi yang Anda atur, dengan penyedia tunnel paket melaporkannya saat mulai. Aplikasi tidak dapat mencantumkan atau menyunting profil yang dipasang oleh aplikasi lain atau profil konfigurasi, jadi jangan menjanjikan layar yang menampilkan setiap VPN di perangkat.

Artikel terkait