Миграция гибридного приложения iOS из UIWebView в WKWebview - PullRequest
0 голосов
/ 11 октября 2019

Я хочу перенести свое гибридное приложение для iOS из UIWebView в WKWebView, так как первое устарело. Есть несколько похожих на этот вопрос вопросов о переполнении стека, на которые уже дан ответ, но эти вопросы были сосредоточены на более простой теме простого отображения веб-представления без учета загрузки локальных файлов или двухстороннего взаимодействия, необходимого между Целью Cобертка и код Javascript для гибридного приложения, обеспечивающего любую функциональность.

До сих пор я установил, что мне нужно сделать следующее

  1. Заменить инструкцию импорта для UIKitс WebKit.

  2. Перед созданием wkwebview необходимо создать объект конфигурации и установить для его ключа allowFileAccessFromFileURLs значение TRUE.

  3. После созданияwkwebview, устанавливая его navigationDelegate и его UIDelegate на self.

  4. При загрузке URL-адреса местоположения файла html / ccc / js, определяя allowReadAccessToURL для удаления последнего компонента пути (который я считаюфайл: //)

  5. Установить рабочий деньwebview как вспомогательное представление основного представления (я думаю, что это не требуется в UIWebView)

  6. Замена существующего канала связи с кода javascrtipt на код Objective C, который использовал "shouldStartLoadWithRequest "путем создания обработчика сообщений сценария в объекте конфигурации wkwebview, упомянутого в пункте 2 выше, и последующего использования этого обработчика сообщений для вызова обработки, которая раньше выполнялась" shouldStartLoadWithRequest ".

  7. Заменавсе существующие каналы связи к коду javascript из кода Objective C, который использовал "stringByEvaluatingJavaScriptFromString" с "defineJavaScript", для которого теперь требуется обработчик завершения, который может быть установлен равным nil, поскольку я не использую никаких значений обратного вызова.

  8. Добавление решения, позволяющего отображать клавиатуру без выбора пользователем поля ввода текста. Лучшее, что я могу видеть на данный момент, это Программно сфокусироваться на форме в веб-представлении (WKWebView) . Я несколько обеспокоен тем, что, похоже, нужно менять каждую версию IOS.

  9. Решение проблем CORS. Я понимаю, что WKWebView намного строже в реализации загрузки удаленных файлов с других URL-адресов, чем был UIWebView, но я не уверен, есть ли необходимость в белом списке также загружать локальные файлы.

Если кто-нибудь знает контрольный список вещей, которые необходимо изменить с помощью советов / примеров с точными деталями, или может предоставить такой ответ, который будет превосходным.

Кроме того, я хотел быпродолжать поддерживать пользователей до IOS 11, сохранив UIWebView для этих пользователей, так как я считаю, что у WKWebView были проблемы в этих более ранних версиях. Кто-нибудь знает, приведет ли это к решению каких-либо дополнительных проблем, и если да, то как?

1 Ответ

0 голосов
/ 11 октября 2019
  1. Да
  2. allowFileAccessFromFileURLs недокументировано, поэтому может работать или не работать в iOS 13.
  3. Да
  4. Да
  5. Да, и это требуется также с UIWebView s. Отличие в том, что добавление WKWebView в раскадровку или перо было невозможно или глючило, по крайней мере, до самых последних версий XCode, возможно, именно поэтому у вас такое впечатление.
  6. Нет, -webview:shouldStartLoadWithRequest:navigationType: метод - это UIWebViewDelegate метод. Вы хотите соответствующий WKNavigationDelegate метод, который является -webView:decidePolicyForNavigationAction:decisionHandler:.
  7. Да
  8. Я не могу ответить на это, поскольку мне никогда не нужно было это делать.
  9. См. # 8

WKWebView существует с iOS 8, поэтому, если вы не ориентируетесь на iOS 7, Apple по-прежнему может отклонить ваше приложение, когда они начнут отклонять использование UIWebView. Я не думаю, что есть какой-либо способ узнать, если это так, кроме отправки приложения для выяснения.

Если ваш JavaScript использует собственные схемы, которые полагаются на делегат веб-просмотра для их правильной обработки (т.е. myscheme://some/callback), это может быть некорректно с Webkit. Вот тут-то и появляется обработчик сообщений скрипта, на который вы ссылались. Но вы должны обновить свой JavaScript, чтобы использовать window.webkit.messageHandlers.someCallback.postMessage(someParams) вместо использования пользовательской схемы URL.

...