Веб-представления в 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://video2.skills-academy.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
от этогоWKWebView
SFSafariViewController
, это контроллер представления, поэтому его нельзя использовать с другими представлениями. Вы должны представить 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);
При этом создается следующее веб-представление:
Safari
Кроме того, можно открыть мобильное приложение Safari из приложения, используя приведенный ниже код:
var url = new NSUrl("https://video2.skills-academy.com");
UIApplication.SharedApplication.OpenUrl(url);
При этом создается следующее веб-представление:
Переход пользователей от приложения к 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 вы ищете ресурсы касательно предупреждения об устаревании UIWebView
UIWebView (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
может присутствовать в некоторых сторонних библиотеках, управляемых или собственных, используемых приложением. Начните с обновления внешних зависимостей до последних версий, так как эта ситуация уже может быть решена в более новом выпуске. Если нет, обратитесь в службу поддержки библиотек и попросите их о планах обновления.
Кроме того, можно попробовать следующие подходы:
- Если вы используете Xamarin.Forms, ознакомьтесь с этой записью блога.
- Включите управляемый компоновщик (по всему проекту или, по крайней мере, по отношению к зависимостям),
UIWebView
чтобы его можно было удалить, если он не указан. Это позволит решить проблему, но может потребоваться дополнительная работа, чтобы сделать компоновщик кода безопасным. - Если вы не можете изменить параметры управляемого компоновщика, ознакомьтесь со специальными случаями ниже.
Приложения не могут использовать компоновщик (или изменить его параметры)
Если по какой-то причине вы не используете управляемый компоновщик (например, не ссылайтесь), 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. Однако этот переход можно сделать с помощью собственного расписания.