Webová zobrazení v Xamarin.iOS

V průběhu životnosti apple pro iOS vydali řadu způsobů, jak vývojáři aplikací začlenit funkce webového zobrazení do svých aplikací. Většina uživatelů využívá integrovaný webový prohlížeč Safari na svém zařízení s iOSem, a proto očekává, že funkce webového zobrazení z jiných aplikací jsou konzistentní s tímto prostředím. Očekávají, že stejná gesta budou fungovat, výkon bude na par a stejné funkce.

iOS 11 zavedl nové změny v obou WKWebView i SFSafariViewController. Další informace o těchto změnách najdete v průvodci webovými změnami v iOSu 11.

WKWebView

WKWebView byl představen v iOSu 8, který vývojářům aplikací umožňuje implementovat rozhraní pro procházení webu podobnému mobilnímu Safari. To je částečně způsobeno skutečností, že WKWebView používá Nitro Javascript engine, stejný motor používaný mobilním Safari. WKWebView měla by být vždy použita přes UIWebView, pokud je to možné kvůli zvýšenému výkonu, integrovaným uživatelsky přívětivým gestům a snadné interakci mezi webovou stránkou a vaší aplikací.

WKWebView můžete do aplikace přidat téměř stejným způsobem jako UIWebView, ale jako vývojáři máte mnohem větší kontrolu nad uživatelským rozhraním nebo uživatelským rozhraním a funkcemi. Při vytváření a zobrazení objektu webového zobrazení se zobrazí požadovaná stránka, ale můžete určit, jak se zobrazení zobrazí, jak může uživatel procházet a jak uživatel zobrazení ukončí.

Následující kód můžete použít ke spuštění WKWebView aplikace 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);

Je důležité si uvědomit, že WKWebView je v WebKit oboru názvů, takže budete muset tuto direktivu using přidat do horní části třídy.

WKWebView můžete také použít v aplikacích Xamarin.Mac a měli byste ho použít, pokud vytváříte multiplatformní aplikaci pro Mac/iOS.

Recept na zpracování upozornění JavaScriptu také poskytuje informace o používání WKWebView s JavaScriptem.

SFSafariViewController

SFSafariViewController je nejnovější způsob, jak poskytnout webový obsah z aplikace a je k dispozici v iOSu 9 a novějším. Na rozdíl od UIWebView nebo WKWebViewSFSafariViewController je kontroler zobrazení a nelze ho použít s jinými zobrazeními. Měli byste ho prezentovat SFSafariViewController jako nový kontroler zobrazení stejným způsobem jako jakýkoli kontroler zobrazení.

SFSafariViewController je v podstatě mini safari, který je možné vložit do vaší aplikace. Stejně jako WKWebView používá stejný Nitro Javascript Engine, ale také poskytuje řadu dalších funkcí Safari, jako je automatické vyplňování, čtečka a schopnost sdílet soubory cookie a data s mobilním Safari. Interakce mezi uživatelem a uživatelem SFSafariViewController není přístupná pro vaši aplikaci. Vaše aplikace nebude mít přístup k žádné z výchozích funkcí Safari.

Ve výchozím nastavení také implementuje tlačítko Hotovo , které umožňuje uživateli snadno se vrátit do aplikace a navigační tlačítka vpřed a zpět, což uživateli umožňuje procházet zásobníkem webových stránek. Kromě toho poskytuje uživateli také adresní řádek, který mu dává jistotu, že se nachází na očekávané webové stránce. Adresní řádek neumožňuje uživateli změnit adresu URL.

Tyto implementace nelze změnit, takže SFSafariViewController je ideální použít jako výchozí prohlížeč, pokud vaše aplikace chce prezentovat webovou stránku bez jakéhokoli přizpůsobení.

Následující kód můžete použít ke spuštění SFSafariViewController aplikace Xamarin.iOS:

var sfViewController = new SFSafariViewController(url);

PresentViewController(sfViewController, true, null);

Vytvoří se následující webové zobrazení:

Ukázkové webové zobrazení s SFSafariViewController

Safari

Mobilní aplikaci Safari je také možné otevřít z aplikace pomocí následujícího kódu:

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

UIApplication.SharedApplication.OpenUrl(url);

Vytvoří se následující webové zobrazení:

Webová stránka zobrazená v Safari

Při navigaci uživatelů mimo vaši aplikaci do Safari byste se měli obecně vyhnout. Většina uživatelů neočekává navigaci mimo vaši aplikaci, takže pokud aplikaci opustíte, uživatelé ji nemusí nikdy vrátit, v podstatě zabíjející zapojení.

Vylepšení iOSu 9 umožňují uživateli snadno se vrátit do aplikace pomocí tlačítka Zpět, které je k dispozici v levém horním rohu stránky Safari.

Zabezpečení přenosu aplikací

Společnost Apple v iOSu 9 zavedla službu App Transport Security nebo ATS , aby se zajistilo, že veškerá internetová komunikace odpovídá osvědčeným postupům zabezpečeného připojení.

Další informace o ATS, včetně toho, jak ji implementovat ve vaší aplikaci, najdete v příručce App Transport Security .

Vyřazení uiWebView

UIWebView je starší způsob poskytování webového obsahu ve vaší aplikaci společností Apple. Byla vydána v iOSu 2.0 a od verze 8.0 je zastaralá.

Důležité

UIWebView je zastaralý. Nové aplikace používající tento ovládací prvek nebudou přijaty do App Storu od dubna 2020 a aktualizace aplikací používající tento ovládací prvek nebudou přijaty do prosince 2020.

UIWebView Dokumentace společnosti Apple navrhuje, aby se aplikace místo toho používalyWKWebView.

Pokud hledáte prostředky týkající se UIWebView upozornění na vyřazení (ITMS-90809) při používání Xamarin.Forms, projděte si dokumentaci k webovému zobrazení Xamarin.Forms.

Vývojáři, kteří odeslali aplikace pro iOS za posledních šest měsíců (nebo tak), mohli obdržet upozornění z App Storu o UIWebView vyřazení.

Vyřazení rozhraní API jsou běžná. Xamarin.iOS používá vlastní atributy k signalizaci těchto rozhraní API (a navrhuje nahrazení, pokud jsou k dispozici) zpět vývojářům. Co se tentokrát liší a mnohem méně časté je, že vyřazení bude vynucováno App Storem společnosti Apple při odeslání.

Odebrání UIWebView typu z Xamarin.iOS.dll je bohužel binární zásadní změna. Tato změna přeruší stávající knihovny třetích stran, včetně některých, které už nemusí být podporované nebo dokonce znovu kompilovatelné (například uzavřený zdroj). Tím se vytvoří jenom další problémy pro vývojáře. Proto typ ještě neodebrali.

Od Xamarin.iOS 13.16 jsou k dispozici nové nástroje pro detekci a nástroje, které vám pomůžou s migrací z UIWebView.

Detection

Pokud jste nedávno odeslali aplikaci pro iOS do Apple App Storu, může vás zajímat, jestli tato situace platí pro vaše aplikace.

Pokud chcete zjistit, můžete přidat --warn-on-type-ref=UIKit.UIWebView další argumenty mtouch projektu . Tím se zobrazí upozornění na všechny odkazy na zastaralé UIWebView v rámci vaší aplikace (a všechny její závislosti). Různá upozornění se používají k typům sestav před a po spuštění spravovaného linkeru.

Upozornění, stejně jako ostatní, mohou být převedena na chyby pomocí -warnaserror:. To může být užitečné, pokud chcete zajistit, aby po ověření nebyla přidána nová závislost UIWebView . Příklad:

  • -warnaserror:1502 hlásí chyby, pokud se v předvázaných sestaveních nacházejí nějaké odkazy.
  • -warnaserror:1503 bude hlásit chyby, pokud se v sestaveních po propojení nacházejí nějaké odkazy.

Upozornění můžete také umlčet, pokud nejsou užitečné výsledky před propojením nebo po vytvoření odkazu. Příklad:

  • -nowarn:1502nebude oznamovat upozornění, pokud se v před propojených sestaveních nacházejí nějaké odkazy.
  • -nowarn:1503nebude oznamovat upozornění, pokud se v následných sestaveních nacházejí nějaké odkazy.

Odstranění

Každá aplikace je jedinečná. Odebrání UIWebView z aplikace může vyžadovat různé kroky v závislosti na tom, jak a kde se používá. Nejběžnější scénáře jsou následující:

  • V aplikaci se nepoužívá UIWebView . Všechno je v pořádku. Při odesílání do AppStore byste neměli mít upozornění. Od vás není potřeba nic jiného.
  • Přímé použití UIWebView vaší aplikace. Začněte tím, že odeberete své použití UIWebView, například nahraďte novějšími WKWebView typy (iOS 8) nebo SFSafariViewController (iOS 9). Jakmile se dokončí spravovaný linker, neměl by se zobrazit žádný odkaz UIWebView a konečný binární soubor aplikace nebude mít žádné stopy.
  • Nepřímé použití. UIWebView může být k dispozici v některých knihovnách třetích stran, a to buď spravované, nebo nativní, které vaše aplikace používá. Začněte aktualizací externích závislostí na jejich nejnovější verze, protože tato situace už může být vyřešena v novější verzi. Pokud ne, obraťte se na správce knihoven a zeptejte se na své plány aktualizací.

Případně můžete vyzkoušet následující přístupy:

  1. Pokud používáte Xamarin.Forms, přečtěte si tento blogový příspěvek.
  2. Povolte spravovaný linker (v celém projektu nebo alespoň na závislost pomocí UIWebView), aby se mohl odebrat, pokud na něj neodkazuje. Tím se problém vyřeší, ale může to vyžadovat další práci, aby byl linker kódu bezpečný.
  3. Pokud nemůžete změnit nastavení spravovaného linkeru, podívejte se na následující zvláštní případy.

Aplikace nemůžou používat linker (nebo změnit jeho nastavení).

Pokud z nějakého důvodu nepoužívátespravovaný linker (například Ne linkovat), UIWebView zůstane symbol v binární aplikaci, kterou odešlete společnosti Apple, a může být odmítnut.

Vynuceným řešením je přidat --optimize=force-rejected-types-removal do argumentů Další mtouch projektu. Tím se odeberou trasování UIWebView z aplikace. Jakýkoli kód, který odkazuje na typ, ale nebude správně fungovat (očekává se výjimky nebo chybové ukončení). Tento přístup byste měli použít jenom v případě, že jste si jisti, že kód není dostupný za běhu (i když byl dostupný prostřednictvím statické analýzy).

Podpora pro iOS 7.x (nebo starší)

UIWebView je součástí iOSu od verze 2.0. Nejběžnější náhrady jsou WKWebView (iOS 8) a SFSafariViewController (iOS 9). Pokud vaše aplikace stále podporuje starší verze iOS, měli byste zvážit následující možnosti:

  • Nastavte iOS 8 jako minimální cílovou verzi (rozhodnutí o čase sestavení).
  • Používejte WKWebView ji jenom v případě, že je aplikace spuštěná v iOSu 8+ (rozhodnutí o běhu).

Aplikace neodeslané společnosti Apple

Pokud se vaše aplikace neodesílala společnosti Apple, měli byste se od zastaralého rozhraní API odejít, protože ji můžete odebrat v budoucích verzích iOS. Tento přechod však můžete provést pomocí vlastního časového rozvrhu.