Веб-представления в Xamarin.iOS

На протяжении всего времени существования iOS Apple выпустила несколько способов для разработчиков приложений включить функции веб-представления в свои приложения. Большинство пользователей используют встроенный веб-браузер Safari на устройстве iOS и поэтому ожидают, что функции веб-представления из других приложений согласованы с этим интерфейсом. Они ожидают, что одни и те же жесты будут работать, производительность будет находиться на паре, и функциональные возможности одинаковы.

IOS 11 ввел новые изменения в обоих WKWebView и SFSafariViewController. Дополнительные сведения об этих изменениях см. в руководстве по веб-работе с iOS 11.

WKWebView

WKWebView появилась в iOS 8, которая позволяет разработчикам приложений реализовать интерфейс браузера, аналогичный мобильному Safari. Это связано, в частности, с тем, что WKWebView использует модуль Nitro Javascript, тот же механизм, используемый мобильным Safari. WKWebView всегда следует использовать в UIWebView, где это возможно из-за повышения производительности, встроенных пользовательских жестов, а также простоту взаимодействия между веб-страницей и приложением.

WKWebView можно добавить в приложение практически идентичным способом uiWebView, однако разработчик имеет гораздо больше контроля над пользовательским интерфейсом и UX и функциональными возможностями. Создание и отображение объекта веб-представления будет отображать запрошенную страницу, однако вы можете управлять тем, как представление представлено, как пользователь может перемещаться и как пользователь выходит из представления.

Приведенный 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);

Важно отметить, что WKWebView в WebKit пространстве имен необходимо добавить эту директиву using в верхнюю часть класса.

WKWebView также можно использовать в приложениях Xamarin.Mac и использовать его, если вы создаете кроссплатформенное приложение Mac/iOS.

Рецепт оповещений JavaScript также содержит сведения об использовании WKWebView с Javascript.

SFSafariViewController

SFSafariViewController — это последний способ предоставления веб-содержимого из приложения и доступен в iOS 9 и более поздних версиях. В отличие UIWebView от этогоWKWebViewSFSafariViewController, это контроллер представления, поэтому его нельзя использовать с другими представлениями. Вы должны представить SFSafariViewController в качестве нового контроллера представления таким же образом, как и любой контроллер представления.

SFSafariViewController это по сути мини-сафари, который можно внедрить в приложение. Как и WKWebView, он использует тот же модуль Nitro Javascript, но также предоставляет ряд дополнительных функций Safari, таких как AutoFill, Reader, и возможность совместного использования файлов cookie и данных с мобильным Safari. Взаимодействие между пользователем и SFSafariViewController приложением недоступно. Ваше приложение не будет иметь доступа к каким-либо функциям Safari по умолчанию.

Он также, по умолчанию, реализует кнопку "Готово ", что позволяет пользователю легко вернуться в приложение, а также кнопки навигации вперед и назад, что позволяет пользователю перемещаться по стеку веб-страниц. Кроме того, он также предоставляет пользователю адресную строку, предоставляя им спокойствие, что они находятся на ожидаемой веб-странице. Адресная строка не позволяет пользователю изменять URL-адрес.

Эти реализации нельзя изменить, поэтому SFSafariViewController идеально подходит для использования в качестве браузера по умолчанию, если ваше приложение хочет представить веб-страницу без каких-либо настроек.

Приведенный SFSafariViewController ниже код можно использовать для запуска в приложении Xamarin.iOS:

var sfViewController = new SFSafariViewController(url);

PresentViewController(sfViewController, true, null);

При этом создается следующее веб-представление:

An example web view with SFSafariViewController

Safari

Кроме того, можно открыть мобильное приложение Safari из приложения, используя приведенный ниже код:

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

UIApplication.SharedApplication.OpenUrl(url);

При этом создается следующее веб-представление:

A web page presented in Safari

Переход пользователей от приложения к Safari обычно следует избегать. Большинство пользователей не ожидают навигации за пределами приложения, поэтому если вы переходите от вашего приложения, пользователи никогда не смогут вернуть его, по сути убив взаимодействие.

Улучшения iOS 9 позволяют пользователю легко вернуться в приложение с помощью кнопки "Назад", предоставленной в левом верхнем углу страницы Safari.

Безопасность транспорта приложения

Безопасность транспорта приложений или ATS была представлена Apple в iOS 9, чтобы обеспечить соответствие всех интернет-коммуникаций рекомендациям по безопасному подключению.

Дополнительные сведения об ATS, включая его реализацию в приложении, см. в руководстве по безопасности транспорта приложений.

Устаревание UIWebView

UIWebView — это устаревший способ предоставления веб-содержимого в приложении Apple. Она была выпущена в iOS 2.0 и устарела по состоянию на 8.0.

Внимание

UIWebView не рекомендуется к использованию. Новые приложения, использующие этот элемент управления , не будут приняты в App Store по состоянию на апрель 2020 года, а обновления приложений, использующих этот элемент управления, не будут приняты к декабрю 2020 года.

UIWebView Документация Apple предполагает, что приложения должны использовать WKWebView вместо этого.

Если при использовании Xamarin.Forms вы ищете ресурсы касательно предупреждения об устаревании UIWebViewUIWebView (ITMS-90809), ознакомьтесь с документацией по Xamarin.Forms WebView.

Разработчики, отправившие приложения iOS за последние шесть месяцев (или около того), могли получать предупреждение от App Store о UIWebView том, что они устарели.

Нерекомендуемые API являются общими. Xamarin.iOS использует пользовательские атрибуты, чтобы сигнализировать об этих API (и предлагать замены при наличии) разработчикам. То, что отличается на этот раз, и гораздо менее распространено, заключается в том, что нерекомендуемое использование будет применяться Apple App Store во время отправки.

К сожалению, удаление UIWebView типа из Xamarin.iOS.dll двоичного критического изменения. Это изменение нарушает существующие сторонние библиотеки, включая некоторые, которые больше не поддерживаются или даже повторно компилируются (например, закрытый источник). Это создаст только дополнительные проблемы для разработчиков. Поэтому мы еще не удаляем тип.

Начиная с Xamarin.iOS 13.16 доступны новые средства обнаружения и средств, которые помогут вам выполнить миграцию.UIWebView

Detection

Если вы недавно отправили приложение iOS в Apple App Store, вы можете задаться вопросом, относится ли эта ситуация к вашим приложениям.

Чтобы узнать, можно добавить --warn-on-type-ref=UIKit.UIWebView дополнительные аргументы mtouch проекта . Это предупредит любую ссылку на нерекомендуемую UIWebView в приложении (и все ее зависимости). Различные предупреждения используются для отчетов типов до и после выполнения управляемого компоновщика.

Предупреждения, как и другие, могут быть преобразованы в ошибки с помощью -warnaserror:. Это может быть полезно, если вы хотите убедиться, что новая зависимость UIWebView не добавляется после проверки. Например:

  • -warnaserror:1502 сообщит об ошибках, если ссылки находятся в предварительно связанных сборках.
  • -warnaserror:1503 сообщит об ошибках, если ссылки находятся в сборках после связывания.

Кроме того, вы можете замолчать предупреждения, если результаты предварительной или последующей компоновки не полезны. Например:

  • -nowarn:1502Не будет сообщать предупреждения, если ссылки находятся в предварительно связанных сборках.
  • -nowarn:1503Не будет сообщать предупреждения, если ссылки находятся в сборках после связывания.

Удаление

Каждое приложение уникально. Удаление UIWebView из приложения может требовать различных шагов в зависимости от того, как и где он используется. Ниже приведены наиболее распространенные сценарии.

  • В приложении не используется UIWebView . Все хорошо. При отправке в AppStore не должно быть предупреждений. От вас ничего другого не требуется.
  • Прямое использование UIWebView приложения. Сначала удалите использование UIWebView, например, замените его более новыми WKWebView типами (iOS 8) или SFSafariViewController (iOS 9). После завершения работы управляемого компоновщика не должно отображаться ссылка на UIWebView конечный двоичный файл приложения.
  • Косвенное использование. UIWebView может присутствовать в некоторых сторонних библиотеках, управляемых или собственных, используемых приложением. Начните с обновления внешних зависимостей до последних версий, так как эта ситуация уже может быть решена в более новом выпуске. Если нет, обратитесь в службу поддержки библиотек и попросите их о планах обновления.

Кроме того, можно попробовать следующие подходы:

  1. Если вы используете Xamarin.Forms, ознакомьтесь с этой записью блога.
  2. Включите управляемый компоновщик (по всему проекту или, по крайней мере, по отношению к зависимостям), UIWebViewчтобы его можно было удалить, если он не указан. Это позволит решить проблему, но может потребоваться дополнительная работа, чтобы сделать компоновщик кода безопасным.
  3. Если вы не можете изменить параметры управляемого компоновщика, ознакомьтесь со специальными случаями ниже.

Приложения не могут использовать компоновщик (или изменить его параметры)

Если по какой-то причине вы не используете управляемый компоновщик (например, не ссылайтесь), UIWebView символ останется в двоичном приложении, которое вы отправляете в Apple, и это может быть отклонено.

Принудительное решение заключается в добавлении --optimize=force-rejected-types-removal дополнительных аргументов mtouch проекта. Это приведет к удалению UIWebView трассировок из приложения. Однако любой код, ссылающийся на тип, не будет работать должным образом (ожидайте исключения или сбои). Этот подход следует использовать только в том случае, если вы уверены, что код недоступен во время выполнения (даже если он доступен через статический анализ).

Поддержка iOS 7.x (или более ранней версии)

UIWebView является частью iOS с версии 2.0. Наиболее распространенными заменами являются WKWebView (iOS 8) и SFSafariViewController (iOS 9). Если приложение по-прежнему поддерживает старые версии iOS, следует рассмотреть следующие варианты:

  • Сделайте iOS 8 минимальной целевой версией (решение о времени сборки).
  • Используется WKWebView только в том случае, если приложение работает в iOS 8+ (решение среды выполнения).

Приложения, не отправленные в Apple

Если ваше приложение не отправлено в Apple, следует запланировать переход от устаревшего API, так как его можно удалить в будущих выпусках iOS. Однако этот переход можно сделать с помощью собственного расписания.