Cara memanggil API dalaman daripada aplikasi iPhone melalui VPN
Klasifikasikan permintaan yang gagal mengikut kod NSURLError-nya sebelum menyentuh terowong, kemudian baiki tepat lapisan yang benar-benar rosak.
API menjawab dalam Safari pada telefon yang sama, tetapi permintaan aplikasi tamat masa. Jurang itu biasanya bukan terowong: aplikasi yang memanggil perkhidmatan dalaman membuat permintaan HTTPS biasa, dan VPN yang sedia ada pada peranti hanya menentukan sama ada permintaan itu mempunyai laluan. Menulis terowong kedua ke dalam aplikasi ialah keputusan produk, bukan pembaikan untuk tamat masa. Berikut mengklasifikasikan kegagalan mengikut tempat ia berlaku, menggunakan permukaan ralat yang sudah ada pada aplikasi.
Mulakan dengan ralat, bukan terowong
URLSession melaporkan kegagalan pengangkutan sebagai NSError nilai dalam NSURLErrorDomain, dan kod itu ialah bukti termurah yang tersedia. Sebelum menukar mana-mana konfigurasi, log kod itu bersama nama hos yang gagal dan masa berlalu tugasan itu. Tamat masa, kegagalan nama dan kegagalan kepercayaan kelihatan sama pada skrin dan memerlukan tiga pembaikan berbeza. Klasifikasikan dahulu, kemudian baca bahagian untuk kelas itu.
Metrik tugasan menjawab soalan susulan, sama ada sambungan pernah diwujudkan, yang memisahkan permintaan yang tidak pernah mempunyai laluan daripada yang pelayan terlalu lambat menjawab. Tiada satu pun daripada ini memerlukan terowong diubah; ia memerlukan diagnostik permintaan itu sendiri dicetak di tempat yang boleh anda baca.
Peleraian nama gagal sebelum apa-apa lagi boleh
Nama pejabat pendek seperti api.corp.example biasanya bergantung pada domain carian yang tidak dibawa telefon, jadi aplikasi meleraikan nama yang hanya wujud di dalam bangunan. NSURLErrorCannotFindHost ialah tandatangannya. Nama hos penuh mesti dileraikan melalui mana-mana peleraian yang dipasang VPN, dan aplikasi patut meminta bentuk yang layak sepenuhnya apabila domain carian tidak dijamin. Menukar nama dengan alamat dan mematikan semakan sijil mengalihkan kegagalan dan bukannya membaikinya.
Rekod DNS peribadi dan sijil yang dikeluarkan untuk nama itu tepat ialah pasangan yang disokong. Segala-galanya ialah jalan pintas yang sampai kepada pengguna.
Tamat masa ialah persoalan laluan, bukan persoalan nama
NSURLErrorTimedOut bermaksud nama telah dileraikan dan tiada apa-apa menjawab, yang menunjuk ke laluan, dasar paket atau perkhidmatan. Apabila terowong diberikan mengikut aplikasi, aplikasi lain yang mencapai pelayan yang sama tidak berkata apa-apa tentang binaan anda, kerana pemetaan itu tidak dikongsi. Semak sama ada bundel yang anda jalankan berada dalam pemberian itu, kemudian semak sama ada laluan perkhidmatan dibenarkan untuknya. Binaan pembangunan yang dipasang di luar pemberian boleh berada sepenuhnya di luar terowong dan kelihatan seperti API yang rosak.
Perbandingan pelayar menunjukkan bahawa sesetengah aplikasi pada peranti mempunyai laluan. Ia tidak pernah membuktikan bahawa binaan anda mempunyainya, sebab itu kedua-dua ujian mesti dijalankan secara berasingan.
Kegagalan kepercayaan berkaitan dengan nama pada sijil
NSURLErrorServerCertificateUntrusted bersama ralat TLS di bawahnya bermaksud rantai atau semakan identiti gagal. CA dalaman mesti dipercayai pada peranti, dan sijil yang dikeluarkan untuk nama hos lain masih salah selepas sebarang konfigurasi semula rangkaian. panduan App Transport Security masih terpakai kepada sambungan pemuat URL ini, dan terowong di sekeliling perkhidmatan HTTP biasa tidak menjadikan perkhidmatan itu selamat dari hujung ke hujung.
Betulkan identiti atau sauh kepercayaan dan biarkan senarai pengecualian kosong. Pengecualian menyeluruh untuk pemuatan sewenang-wenangnya menyembunyikan kegagalan semasa pembangunan dan membiarkannya di tempatnya untuk setiap pengguna selepas itu.
Penolakan HTTP milik aplikasi, bukan rangkaian
401 atau 403 selepas jabat tangan selesai bermaksud permintaan itu tiba dan perkhidmatan menolaknya, jadi soalan yang tinggal ialah akaun, audiens token, skop atau kunci. Log kod status dan nama hos, jangan sekali-kali token pembawa atau badan respons. Pada ketika itu terowong melakukan tugasnya dan perubahan rangkaian selanjutnya hanya melambatkan pembaikan sebenar.
Jadual itu ialah klasifikasi untuk disimpan di sebelah terminal: satu baris bagi setiap kegagalan yang benar-benar boleh dilaporkan oleh aplikasi. Cetak kod itu sebelum anda membacanya, kerana baris yang anda pilih menentukan bahagian yang anda kerjakan.
| Where it fails | What the app sees | First check |
|---|---|---|
| name resolution | NSURLErrorCannotFindHost (-1003) | resolve the fully qualified name from the device itself |
| no path, or no answer | NSURLErrorTimedOut (-1001) | is this bundle inside the per-app mapping, and is the service path allowed |
| TLS trust | NSURLErrorServerCertificateUntrusted (-1202) | does the certificate name match the host, and is the internal CA trusted |
| service refusal | HTTP 401 or 403 after a completed handshake | account, token audience, scope or key |
Setiap baris lebih murah untuk diuji daripada baris di bawahnya, dan setiap satu menyingkirkan lapisan berbeza bagi permintaan yang sama. Turunkan jadual sehingga satu baris sepadan, kemudian berhenti menukar rangkaian.