วิธีเรียก API ภายในจากแอป iPhone ผ่าน VPN
จัดประเภทคำขอที่ล้มเหลวตามรหัส NSURLError ก่อนแตะอุโมงค์ แล้วซ่อมเฉพาะชั้นที่เสียจริง ๆ
API ตอบกลับใน Safari บนโทรศัพท์เครื่องเดียวกัน ขณะที่คำขอของแอปหมดเวลา ช่องว่างนี้มักไม่ใช่อุโมงค์: แอปที่เรียกบริการภายในจะส่งคำขอ HTTPS ธรรมดา และ VPN ที่มีอยู่แล้วในอุปกรณ์เพียงตัดสินว่าคำขอนั้นมีเส้นทางหรือไม่ การเขียนอุโมงค์ที่สองลงในแอปเป็นการตัดสินใจระดับผลิตภัณฑ์ ไม่ใช่การซ่อมแซมสำหรับการหมดเวลา ต่อไปนี้จัดประเภทความล้มเหลวตามตำแหน่งที่เกิดขึ้น โดยใช้พื้นผิวข้อผิดพลาดที่แอปมีอยู่แล้ว
เริ่มจากข้อผิดพลาด ไม่ใช่อุโมงค์
URLSession รายงานความล้มเหลวในการขนส่งเป็น NSError ค่าใน NSURLErrorDomain และรหัสคือหลักฐานที่ถูกที่สุดที่หาได้ ก่อนเปลี่ยนการกำหนดค่าใด ๆ ให้บันทึกรหัสนั้นพร้อมชื่อโฮสต์ที่ล้มเหลวและเวลาที่ใช้ไปของงาน การหมดเวลา ความล้มเหลวของชื่อ และความล้มเหลวของความเชื่อใจดูเหมือนกันบนหน้าจอและต้องซ่อมสามแบบที่ต่างกัน จัดประเภทก่อน แล้วอ่านส่วนของประเภทนั้น
ตัวชี้วัดของงานตอบคำถามถัดไปว่ามีการสร้างการเชื่อมต่อขึ้นมาหรือไม่ ซึ่งแยกคำขอที่ไม่เคยมีเส้นทางออกจากคำขอที่เซิร์ฟเวอร์ใช้เวลานานเกินไปในการตอบ ไม่มีสิ่งใดในนี้ต้องเปลี่ยนอุโมงค์ สิ่งที่ต้องทำคือพิมพ์การวินิจฉัยของคำขอเองในที่ที่คุณอ่านได้
การแปลงชื่อล้มเหลวก่อนสิ่งอื่นใด
ชื่อสำนักงานสั้น ๆ เช่น api.corp.example มักขึ้นอยู่กับโดเมนค้นหาที่โทรศัพท์ไม่มี แอปจึงแปลงชื่อที่มีอยู่เฉพาะภายในอาคาร NSURLErrorCannotFindHost คือลายเซ็น ชื่อโฮสต์เต็มต้องถูกแปลงผ่านตัวแปลงใดก็ตามที่ VPN ติดตั้ง และแอปควรขอรูปแบบที่ผ่านการรับรองเต็มรูปแบบทุกครั้งที่โดเมนค้นหาไม่ได้รับการรับประกัน การเปลี่ยนชื่อเป็นที่อยู่และการปิดการตรวจสอบใบรับรองเป็นการย้ายความล้มเหลวแทนที่จะซ่อม
บันทึก DNS ส่วนตัวและใบรับรองที่ออกสำหรับชื่อนั้นโดยเฉพาะคือคู่ที่รองรับ สิ่งอื่นทั้งหมดเป็นทางอ้อมที่ส่งถึงผู้ใช้
การหมดเวลาเป็นคำถามเรื่องเส้นทาง ไม่ใช่เรื่องชื่อ
NSURLErrorTimedOut หมายถึงชื่อถูกแปลงแล้วและไม่มีใครตอบ ซึ่งชี้ไปที่เส้นทาง นโยบายแพ็กเก็ต หรือบริการ เมื่ออุโมงค์ถูกกำหนดต่อแอป แอปอื่นที่ไปถึงเซิร์ฟเวอร์เดียวกันไม่บอกอะไรเกี่ยวกับบิลด์ของคุณ เพราะการแมปนั้นไม่ได้แชร์กัน ตรวจสอบว่าบันเดิลที่คุณรันอยู่ในการกำหนดนั้น แล้วตรวจสอบว่าเส้นทางของบริการได้รับอนุญาตสำหรับมัน บิลด์สำหรับพัฒนาการที่ติดตั้งนอกการกำหนดอาจอยู่นอกอุโมงค์ทั้งหมดและดูเหมือน API ที่เสีย
การเปรียบเทียบบนเบราว์เซอร์แสดงว่าแอปบางตัวบนอุปกรณ์มีเส้นทาง มันไม่เคยพิสูจน์ว่าบิลด์ของคุณมี ซึ่งเป็นเหตุผลที่ต้องทำการทดสอบสองอย่างแยกกัน
ความล้มเหลวของความเชื่อใจเกี่ยวกับชื่อบนใบรับรอง
NSURLErrorServerCertificateUntrusted เมื่อรวมกับข้อผิดพลาด TLS ที่อยู่ข้างใต้หมายความว่าห่วงโซ่หรือการตรวจสอบตัวตนล้มเหลว CA ภายในต้องได้รับความเชื่อใจบนอุปกรณ์ และใบรับรองที่ออกให้ชื่อโฮสต์อื่นยังคงผิดหลังการกำหนดค่าเครือข่ายใหม่ไม่ว่าจะมากเพียงใด คำแนะนำ App Transport Security ยังคงใช้กับการเชื่อมต่อที่โหลด URL เหล่านี้ และอุโมงค์รอบบริการ HTTP ธรรมดาไม่ได้ทำให้บริการนั้นปลอดภัยตั้งแต่ต้นจนจบ
ซ่อมตัวตนหรือสมอความเชื่อใจและเก็บรายการข้อยกเว้นให้ว่าง ข้อยกเว้นแบบเหมารวมสำหรับการโหลดตามอำเภอใจซ่อนความล้มเหลวระหว่างการพัฒนาและทิ้งไว้ให้ผู้ใช้ทุกคนหลังจากนั้น
การปฏิเสธ HTTP เป็นของแอป ไม่ใช่ของเครือข่าย
401 หรือ 403 หลังการจับมือที่สมบูรณ์หมายความว่าคำขอมาถึงและบริการปฏิเสธ ดังนั้นคำถามที่เหลือคือบัญชี ผู้ชมโทเคน ขอบเขต หรือคีย์ บันทึกรหัสสถานะและชื่อโฮสต์ ไม่เคยบันทึกโทเคนผู้ถือหรือเนื้อหาการตอบกลับ ณ จุดนั้นอุโมงค์กำลังทำงานของมัน และการเปลี่ยนแปลงเครือข่ายเพิ่มเติมเพียงทำให้การซ่อมจริงล่าช้า
ตารางคือการจัดประเภทที่ควรเก็บไว้ข้างเทอร์มินัล หนึ่งแถวต่อความล้มเหลวหนึ่งอย่างที่แอปสามารถรายงานได้จริง พิมพ์รหัสก่อนอ่าน เพราะแถวที่คุณเลือกเป็นตัวกำหนดว่าคุณจะทำส่วนใด
| 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 |
แต่ละแถวทดสอบได้ถูกกว่ากว่าแถวที่อยู่ถัดลงไป และแต่ละแถวตัดชั้นที่ต่างกันของคำขอเดียวกันออก ไล่ลงตามตารางจนกว่าแถวจะตรงกัน แล้วหยุดเปลี่ยนเครือข่าย