VPN üzerinden iPhone uygulamasından dahili API nasıl çağrılır
Başarısız isteği tünele dokunmadan önce NSURLError koduna göre sınıflandırın, ardından gerçekten bozulan katmanı düzeltin.
API aynı telefonda Safari'de yanıt verirken uygulamanın isteği zaman aşımına uğruyor. Bu fark genellikle tünel değildir: dahili bir hizmeti çağıran uygulama sıradan bir HTTPS isteği yapar ve cihazdaki mevcut VPN yalnızca bu isteğin bir yolu olup olmadığına karar verir. Uygulamaya ikinci bir tünel yazmak bir ürün kararıdır, zaman aşımı için bir onarım değildir. Aşağıdakiler hatayı oluştuğu yere göre sınıflandırır ve uygulamanın zaten sahip olduğu hata yüzeyini kullanır.
Tünelden değil, hatadan başlayın
URLSession aktarım hatalarını NSError değerleri olarak NSURLErrorDomain içinde bildirir ve kod mevcut en ucuz kanıttır. Herhangi bir yapılandırmayı değiştirmeden önce bu kodu başarısız olan ana bilgisayar adıyla ve görevin geçen süresiyle birlikte günlüğe kaydedin. Zaman aşımı, ad hatası ve güven hatası ekranda aynı görünür ve üç farklı onarım gerektirir. Önce sınıflandırın, sonra o sınıfın bölümünü okuyun.
Görev metrikleri bir sonraki soruyu yanıtlar, bir bağlantı hiç kuruldu mu, bu da hiç yolu olmayan isteği sunucunun çok geç yanıtladığı istekten ayırır. Bunların hiçbiri tünelin değiştirilmesini gerektirmez; isteğin kendi tanılamasının okuyabileceğiniz bir yere yazdırılmasını gerektirir.
Ad çözümlemesi her şeyden önce başarısız olur
Şunun gibi kısa bir ofis adı: api.corp.example genellikle telefonun taşımadığı bir arama etki alanına bağlıdır, bu yüzden uygulama yalnızca binanın içinde var olan bir adı çözer. NSURLErrorCannotFindHost bunun imzasıdır. Tam ana bilgisayar adı VPN'in kurduğu hangi çözümleyici olursa olsun onun üzerinden çözülmelidir ve arama etki alanı garanti edilmediğinde uygulama tam nitelikli biçimi istemelidir. Adı bir adresle değiştirmek ve sertifika denetimlerini kapatmak hatayı onarmak yerine taşır.
Özel bir DNS kaydı ve tam olarak o ad için verilmiş bir sertifika desteklenen çift. Geri kalan her şey kullanıcılara ulaşan bir geçici çözümdür.
Zaman aşımı ad değil, yol sorunudur
NSURLErrorTimedOut adın çözüldüğü ve hiçbir şeyin yanıt vermediği anlamına gelir, bu da rotayı, paket ilkesini veya hizmeti işaret eder. Tünel her uygulamaya atandığında, aynı sunucuya ulaşan başka bir uygulama sizin derlemeniz hakkında hiçbir şey söylemez, çünkü o eşleme paylaşılmaz. Çalıştırdığınız paketin bu atamanın içinde olduğunu, ardından hizmet yolunun bunun için izinli olduğunu kontrol edin. Atamanın dışına kurulmuş bir geliştirme derlemesi tünelin tamamen dışında kalabilir ve bozuk bir API gibi görünebilir.
Tarayıcı karşılaştırması cihazdaki bir uygulamanın yolu olduğunu gösterir. Asla sizin derlemenizin yolu olduğunu kanıtlamaz, bu yüzden iki test ayrı ayrı yapılmalıdır.
Güven hataları sertifikadaki adla ilgilidir
NSURLErrorServerCertificateUntrusted altındaki TLS hatasıyla birlikte zincirin veya kimlik denetiminin başarısız olduğu anlamına gelir. Dahili bir CA cihazda güvenilir olmalıdır ve başka bir ana bilgisayar adı için verilmiş bir sertifika ne kadar ağ yeniden yapılandırması yapılırsa yapılsın yanlış kalır. Apple'ın App Transport Security rehberi bu URL yükleyen bağlantılar için geçerliliğini korur ve düz bir HTTP hizmetinin etrafındaki tünel o hizmeti uçtan uca güvenli yapmaz.
Kimliği veya güven çıpasını düzeltin ve istisna listesini boş tutun. Keyfi yükleme için genel bir istisna hatayı geliştirme sırasında gizler ve sonrasında her kullanıcı için yerinde bırakır.
Bir HTTP reddi ağın değil, uygulamanın sorunudur
Tamamlanmış bir el sıkışmasından sonra 401 veya 403, isteğin ulaştığı ve hizmetin onu reddettiği anlamına gelir, bu yüzden kalan soru bir hesap, bir belirteç kitlesi, bir kapsam veya bir anahtardır. Durum kodunu ve ana bilgisayar adını günlüğe kaydedin, asla taşıyıcı belirteci veya yanıt gövdesini değil. O noktada tünel işini yapıyor ve daha fazla ağ değişikliği yalnızca gerçek onarımı geciktirir.
Tablo terminalin yanında tutulacak sınıflandırmadır: uygulamanın gerçekten bildirebileceği her hata için bir satır. Kodu okumadan önce yazdırın, çünkü seçtiğiniz satır hangi bölümü işleyeceğinizi belirler.
| 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 |
Her satırı test etmek altındakinden daha ucuzdur ve her biri aynı isteğin farklı bir katmanını dışlar. Bir satır eşleşene kadar tabloda aşağı inin, sonra ağı değiştirmeyi bırakın.