App Transport security w IOS 9.x

Ostatnio programując uwierzytelnianie do usługi Azure w konkursowej aplikacji dla systemu IOS nadziałem się na coś o czym nie miałem pojęcia… Po stracie kilku godzin szukania gdzie jest problem w końcu udało mi się go rozwiązać. W tym poście skrótowo opiszę temat App Transport Security, być może uda Ci się zaoszczędzić trochę czasu, gdy znajdziesz ten post.

W czym problem?

App Transport Security (ATS) wymusza bezpieczne połączenia pomiędzy zasobami internetu jak np. backend w Azure Mobile Apps a Twoją aplikacją. ATS jest domyślnie włączony dla systemów IOS 9.x W przypadku kiedy próbujesz uzyskać dostęp np do ekranu logowania do usługi Facebook, czy nawet odwołując się do usługi Azure powinieneś korzystać z protokołu HTTPS.

Przykład wywołania utworzenia klienta:

W moim przypadku omyłkowo wkleiłem domyślny adres usługi z portalu Azure, nie zwracając uwagi, że wklejam adres na protokole HTTP. Spowodowało to ciągłe odrzucanie połączenia poprzez system IOS. Zanim się zorientowałem o co chodzi minęło trochę czasu, ponieważ nie otrzymywałem żadnych wyjątków. Dopiero przeglądając logi okna DEBUG znalazłem coś co takiego:

App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
Temporary exceptions can be configured via your app’s Info.plist file.

Rozwiązanie

Chwila “googlania” i jest rozwiązanie. Wystarczyło dodać literkę “S” do adresu wywołania usługi Azure, tak aby korzystać z bezpiecznej wersji tego protokołu. Być może gdyby to wyrzucało wyjątek, lub jakiś bardziej czytelny error, zamiast informacji w “spamie” okna Debug problem rozwiązałbym szybciej.

Udane otwarcie okna logowania na protokole HTTPS
Udane otwarcie okna logowania na protokole HTTPS

Co do samego komunikatu, że można dodawać wyjątki w Info.plist -> oznacza to, że IOS pozwala na skonfigurowanie wyjątków dla adresów, które nie wspierają protokołu HTTPS. Po szczegóły jak ustawić wyjątki zobacz pod ten adres, chociaż nie polecam używać niezabezpieczonego protokołu, bo w przypadku gdy zamierzasz opublikować aplikację to najprawdopodobniej nie przejdzie ona etapu certyfikacji do App Store. W moim przypadku nie było takiej potrzeby, ponieważ Azure oczywiście pozwala na użycie protokołu HTTPS.