Udostępnij za pośrednictwem


Widoki internetowe na platformie Xamarin.iOS

Przez cały okres istnienia systemu iOS firma Apple wydała wiele sposobów, aby deweloperzy aplikacji mogli włączyć funkcje widoku internetowego w swoich aplikacjach. Większość użytkowników korzysta z wbudowanej przeglądarki internetowej Safari na urządzeniu z systemem iOS i dlatego oczekuje, że funkcje widoku internetowego z innych aplikacji są zgodne z tym środowiskiem. Oczekuje się, że te same gesty będą działać, wydajność będzie na równi i funkcjonalność taka sama.

System iOS 11 wprowadził nowe zmiany w systemach WKWebView i SFSafariViewController. Aby uzyskać więcej informacji na ten temat, zobacz Przewodnik po zmianach w sieci Web w systemie iOS 11.

WKWebView

WKWebView wprowadzono w systemie iOS 8, dzięki czemu deweloperzy aplikacji mogą zaimplementować interfejs przeglądania sieci Web podobny do mobilnego Safari. Wynika to częściowo z faktu, że WKWebView korzysta z aparatu Nitro Javascript, tego samego aparatu używanego przez mobilną przeglądarkę Safari. WKWebView należy zawsze używać w interfejsie UIWebView, jeśli to możliwe ze względu na zwiększoną wydajność, wbudowane gesty przyjazne dla użytkownika i łatwość interakcji między stroną internetową a aplikacją.

WKWebView można dodać do aplikacji w niemal identyczny sposób do interfejsu użytkownikaWebView, jednak jako deweloper masz znacznie większą kontrolę nad interfejsem użytkownika/środowiskiem użytkownika i funkcjonalnością. Tworzenie i wyświetlanie obiektu widoku internetowego spowoduje wyświetlenie żądanej strony, jednak można kontrolować sposób prezentowania widoku, sposobu nawigowania po użytkowniku oraz sposobu zamykania widoku przez użytkownika.

Poniższy kod może służyć do uruchamiania aplikacji platformy WKWebView Xamarin.iOS:

WKWebView webView = new WKWebView(View.Frame, new WKWebViewConfiguration());
View.AddSubview(webView);

var url = new NSUrl("https://learn.microsoft.com");
var request = new NSUrlRequest(url);
webView.LoadRequest(request);

Należy pamiętać, że WKWebView znajduje się w WebKit przestrzeni nazw, dlatego należy dodać tę dyrektywę using do góry klasy.

WKWebView można również używać w aplikacjach platformy Xamarin.Mac i należy jej używać, jeśli tworzysz międzyplatformową aplikację dla komputerów Mac/iOS.

Przepis dotyczący obsługi alertów języka JavaScript zawiera również informacje na temat używania elementu WKWebView z językiem JavaScript.

SFSafariViewController

SFSafariViewController to najnowszy sposób dostarczania zawartości internetowej z aplikacji i jest dostępny w systemie iOS 9 lub nowszym. W przeciwieństwie do UIWebView elementu lub WKWebView, SFSafariViewController jest kontrolerem widoku i dlatego nie można go używać z innymi widokami. Należy przedstawić SFSafariViewController jako nowy kontroler widoku w taki sam sposób, jak każdy kontroler widoku.

SFSafariViewController jest zasadniczo "mini safari", które można osadzić w aplikacji. Podobnie jak WKWebView używa tego samego aparatu Nitro Javascript, ale oferuje również szereg dodatkowych funkcji safari, takich jak AutoWypełnianie, Czytelnik i możliwość udostępniania plików cookie i danych w przeglądarce Mobile Safari. Interakcja między użytkownikiem a SFSafariViewController aplikacją nie jest dostępna. Twoja aplikacja nie będzie miała dostępu do żadnej z domyślnych funkcji przeglądarki Safari.

Domyślnie implementuje on również przycisk Gotowe , co umożliwia użytkownikowi łatwe powrót do aplikacji oraz przyciski nawigacji do przodu i wstecz, dzięki czemu użytkownik może przechodzić przez stos stron internetowych. Ponadto udostępnia on również użytkownikowi pasek adresu, zapewniając im spokój, że znajdują się na oczekiwanej stronie internetowej. Pasek adresu nie zezwala użytkownikowi na zmianę adresu URL.

Tych implementacji nie można zmienić, więc SFSafariViewController najlepiej użyć jako domyślnej przeglądarki, jeśli aplikacja chce prezentować stronę internetową bez żadnych dostosowań.

Poniższy kod może służyć do uruchamiania aplikacji platformy SFSafariViewController Xamarin.iOS:

var sfViewController = new SFSafariViewController(url);

PresentViewController(sfViewController, true, null);

Spowoduje to utworzenie następującego widoku internetowego:

Przykładowy widok internetowy z sfSafariViewController

Safari

Istnieje również możliwość otwarcia aplikacji mobilnej Safari z poziomu aplikacji przy użyciu poniższego kodu:

var url = new NSUrl("https://learn.microsoft.com");

UIApplication.SharedApplication.OpenUrl(url);

Spowoduje to utworzenie następującego widoku internetowego:

Strona internetowa przedstawiona w przeglądarce Safari

Nawigowanie użytkowników z dala od aplikacji do przeglądarki Safari powinno być zwykle unikane. Większość użytkowników nie będzie oczekiwać nawigacji poza aplikacją, więc jeśli odejdziesz z aplikacji, użytkownicy nie będą mogli jej zwracać, zasadniczo zabijając zakontraktowanie.

Ulepszenia systemu iOS 9 umożliwiają użytkownikowi łatwe powrót do aplikacji za pomocą przycisku Wstecz, który znajduje się w lewym górnym rogu strony Safari.

Zabezpieczenia transportu aplikacji

Usługa App Transport Security lub ATS została wprowadzona przez firmę Apple w systemie iOS 9, aby upewnić się, że cała komunikacja internetowa jest zgodna z najlepszymi rozwiązaniami dotyczącymi bezpiecznego połączenia.

Aby uzyskać więcej informacji na temat usługi ATS, w tym sposobu implementowania jej w aplikacji, zapoznaj się z przewodnikiem Dotyczącym usługi App Transport Security .

Wycofanie elementu UIWebView

UIWebView to starszy sposób dostarczania zawartości internetowej w aplikacji przez firmę Apple. Został on wydany w systemie iOS 2.0 i został wycofany z wersji 8.0.

Ważne

UIWebView jest przestarzały. Nowe aplikacje korzystające z tej kontrolki nie zostaną zaakceptowane w sklepie App Store od kwietnia 2020 r., a aktualizacje aplikacji korzystających z tej kontrolki nie zostaną zaakceptowane do grudnia 2020 r.

Dokumentacja firmy UIWebView Apple sugeruje, że aplikacje powinny używać zamiast tegoWKWebView.

Jeśli szukasz zasobów w odniesieniu do UIWebView ostrzeżenia o wycofaniu (ITMS-90809) podczas korzystania z zestawu narzędzi Xamarin.Forms, zapoznaj się z dokumentacją interfejsu WebView platformy Xamarin.Forms.

Deweloperzy, którzy przesyłali aplikacje dla systemu iOS w ciągu ostatnich sześciu miesięcy (lub tak), mogli otrzymać ostrzeżenie ze sklepu App Store o UIWebView wycofaniu.

Wycofywanie interfejsów API jest typowe. Platforma Xamarin.iOS używa atrybutów niestandardowych do sygnalizowania tych interfejsów API (i sugerowania zamian, gdy są dostępne) z powrotem do deweloperów. Czym różni się tym razem i znacznie rzadziej jest to, że wycofanie zostanie wymuszone przez sklep App Store firmy Apple w czasie przesyłania.

Niestety usunięcie UIWebView typu z Xamarin.iOS.dll elementu jest zmianą powodującą niezgodność binarną. Ta zmiana spowoduje przerwanie istniejących bibliotek innych firm, w tym niektórych, które mogą nie być już obsługiwane, a nawet ponowne kompilowanie (na przykład zamknięte źródło). Spowoduje to tylko dodatkowe problemy dla deweloperów. W związku z tym nie usuwamy jeszcze typu.

Począwszy od platformy Xamarin.iOS 13.16, nowe narzędzia do wykrywania i wykrywania są dostępne, aby ułatwić migrację z UIWebViewprogramu .

Detection

Jeśli niedawno przesłano aplikację systemu iOS do sklepu Apple App Store, możesz się zastanawiać, czy ta sytuacja dotyczy aplikacji.

Aby dowiedzieć się, możesz dodać --warn-on-type-ref=UIKit.UIWebView do dodatkowych argumentów mtouch projektu. Spowoduje to ostrzeżenie o wszelkich odwołaniach do przestarzałej UIWebView aplikacji (i wszystkich jej zależności). Różne ostrzeżenia są używane do raportowania typów przed i po wykonaniu zarządzanego konsolidatora.

Ostrzeżenia, podobnie jak inne, można przekształcić w błędy przy użyciu polecenia -warnaserror:. Może to być przydatne, jeśli chcesz upewnić się, że nowa zależność UIWebView nie zostanie dodana po weryfikacji. Na przykład:

  • -warnaserror:1502 program zgłosi błędy, jeśli jakiekolwiek odwołania zostaną znalezione w zestawach wstępnie połączonych.
  • -warnaserror:1503 program zgłosi błędy, jeśli jakiekolwiek odwołania zostaną znalezione w zestawach połączonych po połączeniu.

Możesz również wyciszyć ostrzeżenia, jeśli wyniki łączenia przed/po nie są przydatne. Na przykład:

  • -nowarn:1502nie będzie zgłaszać ostrzeżeń, jeśli jakiekolwiek odwołania znajdują się w wstępnie połączonych zestawach.
  • -nowarn:1503nie będzie zgłaszać ostrzeżeń, jeśli jakiekolwiek odwołania znajdują się w zestawach połączonych po połączeniu.

Usuwania

Każda aplikacja jest unikatowa. Usunięcie UIWebView z aplikacji może wymagać różnych kroków w zależności od tego, jak i gdzie jest używana. Najbardziej typowe scenariusze są następujące:

  • Nie ma zastosowania UIWebView wewnątrz aplikacji. Wszystko jest w porządku. Podczas przesyłania do sklepu AppStore nie powinny być wyświetlane ostrzeżenia. Nic innego nie jest wymagane od Ciebie.
  • Bezpośrednie użycie UIWebView przez aplikację. Zacznij od usunięcia użycia elementu UIWebView, na przykład zastąp go nowszymi WKWebView typami (iOS 8) lub SFSafariViewController (iOS 9). Po zakończeniu pracy z zarządzanym konsolidatorem nie powinno być widoczne żadne odwołanie, UIWebView a końcowy plik binarny aplikacji nie będzie miał śladu.
  • Użycie pośrednie. UIWebView może być obecny w niektórych bibliotekach innych firm, zarządzanych lub natywnych, które są używane przez aplikację. Zacznij od zaktualizowania zależności zewnętrznych do najnowszych wersji, ponieważ ta sytuacja może być już rozwiązana w nowszej wersji. Jeśli nie, skontaktuj się z osobami obsługującymi biblioteki i zapytaj o ich plany aktualizacji.

Alternatywnie możesz wypróbować następujące podejścia:

  1. Jeśli używasz zestawu narzędzi Xamarin.Forms, przeczytaj ten wpis w blogu.
  2. Włącz zarządzany konsolidator (w całym projekcie lub przynajmniej na zależności przy użyciu polecenia UIWebView), aby mógł zostać usunięty, jeśli nie zostanie odwołany. To rozwiąże ten problem, ale może wymagać dodatkowej pracy, aby zapewnić bezpieczeństwo konsolidatora kodu.
  3. Jeśli nie możesz zmienić ustawień zarządzanego konsolidatora, zapoznaj się z poniższymi specjalnymi przypadkami.

Aplikacje nie mogą używać konsolidatora (ani zmieniać ustawień)

Jeśli z jakiegoś powodu nie używasz zarządzanego konsolidatora (na przykład Nie łącz), UIWebView symbol pozostanie w aplikacji binarnej przesyłanej do firmy Apple i może zostać odrzucony.

Wymuszone rozwiązanie polega na dodaniu --optimize=force-rejected-types-removal do dodatkowych argumentów mtouch projektu. Spowoduje to usunięcie śladów UIWebView z aplikacji. Jednak każdy kod, który odwołuje się do typu, nie będzie działał prawidłowo (spodziewać się wyjątków lub awarii). Takie podejście powinno być używane tylko wtedy, gdy masz pewność, że kod nie jest osiągalny w czasie wykonywania (nawet jeśli był osiągalny za pośrednictwem analizy statycznej).

Obsługa systemu iOS 7.x (lub starszego)

UIWebView jest częścią systemu iOS od wersji 2.0. Najczęściej używane zamienniki to WKWebView (iOS 8) i SFSafariViewController (iOS 9). Jeśli aplikacja nadal obsługuje starsze wersje systemu iOS, należy wziąć pod uwagę następujące opcje:

  • Ustaw system iOS 8 jako minimalną wersję docelową (decyzję o czasie kompilacji).
  • Użyj WKWebView tylko wtedy, gdy aplikacja jest uruchomiona w systemie iOS 8 lub nowszym (decyzja środowiska uruchomieniowego).

Aplikacje, które nie zostały przesłane do firmy Apple

Jeśli aplikacja nie zostanie przesłana do firmy Apple, należy zaplanować odejście od przestarzałego interfejsu API, ponieważ można go usunąć w przyszłych wersjach systemu iOS. Możesz jednak wykonać to przejście przy użyciu własnego harmonogramu.