Cách gọi API nội bộ từ ứng dụng iPhone qua VPN
Phân loại yêu cầu thất bại theo mã NSURLError của nó trước khi chạm vào đường hầm, sau đó sửa đúng lớp thực sự bị hỏng.
API trả lời trong Safari trên cùng chiếc điện thoại, trong khi yêu cầu của ứng dụng hết thời gian. Khoảng cách đó thường không phải đường hầm: ứng dụng gọi dịch vụ nội bộ thực hiện một yêu cầu HTTPS thông thường, và VPN đã có trên thiết bị chỉ quyết định yêu cầu đó có đường đi hay không. Viết thêm một đường hầm thứ hai vào ứng dụng là quyết định sản phẩm, không phải sửa chữa cho việc hết thời gian. Phần sau phân loại lỗi theo nơi nó xảy ra, dùng bề mặt lỗi mà ứng dụng đã có.
Bắt đầu từ lỗi, không phải từ đường hầm
URLSession báo cáo lỗi truyền tải dưới dạng NSError giá trị trong NSURLErrorDomain, và mã là bằng chứng rẻ nhất hiện có. Trước khi thay đổi bất kỳ cấu hình nào, hãy ghi lại mã đó cùng tên máy chủ bị lỗi và thời gian đã trôi qua của tác vụ. Hết thời gian, lỗi tên và lỗi tin cậy trông giống nhau trên màn hình và cần ba cách sửa khác nhau. Phân loại trước, sau đó đọc phần của lớp đó.
Các chỉ số tác vụ trả lời câu hỏi tiếp theo, liệu có bao giờ thiết lập được kết nối, điều này tách yêu cầu chưa từng có đường đi khỏi yêu cầu mà máy chủ trả lời quá chậm. Không điều nào trong số này cần thay đổi đường hầm; nó cần in chẩn đoán của chính yêu cầu ở nơi bạn có thể đọc.
Phân giải tên thất bại trước mọi thứ khác
Một tên văn phòng ngắn như api.corp.example thường phụ thuộc vào miền tìm kiếm mà điện thoại không có, nên ứng dụng phân giải một tên chỉ tồn tại bên trong tòa nhà. NSURLErrorCannotFindHost là chữ ký. Tên máy chủ đầy đủ phải được phân giải qua bất kỳ trình phân giải nào VPN cài đặt, và ứng dụng nên yêu cầu dạng đủ điều kiện hoàn toàn mỗi khi miền tìm kiếm không được đảm bảo. Thay tên bằng địa chỉ và tắt kiểm tra chứng chỉ sẽ di chuyển lỗi thay vì sửa nó.
Một bản ghi DNS riêng và chứng chỉ được cấp cho đúng tên đó là cặp được hỗ trợ. Mọi thứ khác là một cách vòng tránh đến tay người dùng.
Hết thời gian là câu hỏi về đường đi, không phải về tên
NSURLErrorTimedOut nghĩa là tên đã được phân giải và không có gì trả lời, điều này chỉ ra tuyến, chính sách gói hoặc dịch vụ. Khi đường hầm được gán theo từng ứng dụng, một ứng dụng khác đến cùng máy chủ không nói gì về bản dựng của bạn, vì ánh xạ đó không được chia sẻ. Kiểm tra rằng gói bạn đang chạy nằm trong phạm vi gán đó, sau đó kiểm tra rằng đường dẫn dịch vụ được cho phép cho nó. Một bản dựng phát triển được cài ngoài phạm vi gán có thể nằm hoàn toàn ngoài đường hầm và trông như API bị hỏng.
So sánh trên trình duyệt cho thấy một ứng dụng nào đó trên thiết bị có đường đi. Nó không bao giờ chứng minh rằng bản dựng của bạn có, vì vậy hai bài kiểm tra phải được chạy riêng.
Lỗi tin cậy liên quan đến tên trên chứng chỉ
NSURLErrorServerCertificateUntrusted cùng với lỗi TLS bên dưới nghĩa là chuỗi hoặc kiểm tra danh tính đã thất bại. CA nội bộ phải được tin cậy trên thiết bị, và chứng chỉ cấp cho tên máy chủ khác vẫn sai sau mọi lần cấu hình lại mạng. Hướng dẫn App Transport Security của Apple vẫn áp dụng cho các kết nối tải URL này, và một đường hầm quanh dịch vụ HTTP thông thường không làm dịch vụ đó an toàn từ đầu đến cuối.
Sửa danh tính hoặc neo tin cậy và giữ danh sách ngoại lệ trống. Một ngoại lệ toàn diện cho việc tải tùy ý che giấu lỗi trong quá trình phát triển và để nó tồn tại cho mọi người dùng sau đó.
Sự từ chối HTTP thuộc về ứng dụng, không phải mạng
401 hoặc 403 sau một bắt tay hoàn tất nghĩa là yêu cầu đã đến và dịch vụ đã từ chối nó, vì vậy câu hỏi còn lại là tài khoản, đối tượng token, phạm vi hoặc khóa. Ghi lại mã trạng thái và tên máy chủ, không bao giờ ghi token mang hay nội dung phản hồi. Lúc đó đường hầm đang làm việc của nó, và các thay đổi mạng thêm chỉ trì hoãn việc sửa thật.
Bảng là phân loại cần giữ bên cạnh terminal: một dòng cho mỗi lỗi mà ứng dụng thực sự có thể báo cáo. In mã trước khi bạn đọc nó, vì dòng bạn chọn quyết định phần bạn sẽ xử lý.
| 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 |
Mỗi dòng rẻ hơn để kiểm tra so với dòng bên dưới, và mỗi dòng loại trừ một lớp khác của cùng yêu cầu. Đi xuống bảng cho đến khi một dòng khớp, sau đó ngừng thay đổi mạng.