wkwebview ios 10 прекращает загрузку файлов с помощью localfileurl после восстановления веб-просмотра

У меня странное поведение с wkwebview и ios 10.3 и swift 3.

Я использую wkwebview для отображения локальных файлов HTML (в разделе "Поддержка приложений"). При первом запуске все работает и локальный сайт (включая js и css) работает нормально. Но если я получу обновление содержимого из Интернета (которое включает в себя удаление каталога html и извлечение новых файлов), веб-просмотр не загрузит файлы. Если я просто попытаюсь повторно использовать существующее веб-представление с:

self.webView?.loadFileURL(URL(fileURLWithPath: ( sharedConfig.WEBROOT + self.getIndexPage(requestProps.landingPage))), allowingReadAccessTo: sharedConfig.BASEURL)

или даже с вызовом JavaScript window.location.href='\(self.landingPage)' Я получаю довольно странное сообщение об ошибке в консоли отладки:

Не удалось создать поверхность для размера: (0 0) и формата: (0)

Если я попытаюсь повторно инициализировать wkwebview с помощью:

`...

    DispatchQueue.main.async {

    for subview in self.view.subviews {
        if subview is WKWebView {
            subview.removeFromSuperview()
        }
    }

    let contentController = WKUserContentController();
    contentController.add(
        self,
        name: "callbackHandler"
    )
    let processPool: WKProcessPool = WKProcessPool.init()

    let config = WKWebViewConfiguration()
    config.processPool = processPool
    config.userContentController = contentController
     ...

    self.webView = WKWebView(
        frame: CGRect.zero,
        configuration: config
    )

    self.webView!.uiDelegate = self
    self.webView!.navigationDelegate = self

    self.webView!.translatesAutoresizingMaskIntoConstraints = false
    self.webView!.allowsBackForwardNavigationGestures = true

    let localfilePath = sharedConfig.WEBROOT + absPath

    let localFileUrl = URL(fileURLWithPath: localfilePath)


    self.webView?.tag = 12
    self.view.addSubview(self.webView!)
    let height = NSLayoutConstraint(item: self.webView!, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .height, multiplier: 1, constant: 0)
    let width = NSLayoutConstraint(item: self.webView!, attribute: .width, relatedBy: .equal, toItem: self.view, attribute: .width, multiplier: 1, constant: 0)
    self.view.addConstraints([height, width])
    _ = self.webView?.loadFileURL(localFileUrl, allowingReadAccessTo: sharedConfig.BASEURL)
    }

ничего не происходит - без изменения отображаемого HTML, без ошибок, без замораживания - локальный веб-сайт работает как обычно (за исключением функций, использующих вызов loadFileURL - но этот код работает в ios 9.3, и я уверен, что он работал один раз в ios 10.

Я также знаю об ошибке в бета-версии ios 10.3 с проблемами wkwebview и путями к файлам с пробелами - но я также проверил это с помощью каталога Documents с тем же результатом.

Но через некоторое время я получил этот вывод журнала:

Не удалось сообщить службе com.apple.WebKit.Networking: 113: Не удалось найти указанную службу

Этот ответ указывает на то, что это может быть связано с неправильным добавлением веб-просмотра в качестве подпредставления. Но я не вижу, сделал ли я что-то не так с добавлением веб-просмотра в подпредставление...

Обновить

Дальнейшая отладка иерархии представлений оказывается "неоднозначной позицией для wkwebview".

И po [[UIWindow keyWindow] _autolayoutTrace] Результаты в это:

•UIWindow:0x7fbce4b06380 - AMBIGUOUS LAYOUT
|   UITransitionView:0x7fbce2424cc0
|   |   •UIView:0x7fbce2611430
|   |   |   *_UILayoutGuide:0x7fbce2612150
|   |   |   *_UILayoutGuide:0x7fbce260cf10
|   |   |   *WKWebView:0x7fbce508b000'Appname'- AMBIGUOUS LAYOUT for WKWebView:0x7fbce508b000'Appname'.minX{id: 72}, WKWebView:0x7fbce508b000'Appname'.minY{id: 73}
|   |   |   |   WKScrollView:0x7fbce508b600
|   |   |   |   |   WKContentView:0x7fbce5086000
|   |   |   |   |   |   UIView:0x7fbce25194c0
|   |   |   |   |   |   |   UIView:0x7fbce25136e0
|   |   |   |   |   |   |   |   WKCompositingView:0x7fbce261f4f0
|   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce26201c0
|   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce2620020
|   |   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce261fce0
|   |   |   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce2620500
|   |   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce261fe80
|   |   |   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce251a4d0
|   |   |   |   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce251a330
|   |   |   |   |   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce2522790
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   UIScrollView:0x7fbce4069000
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce251e230
|   |   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce261e280
|   |   |   |   |   |   |   |   |   WKCompositingView:0x7fbce2620360
|   |   |   |   |   UIView:0x7fbce2509060
|   |   |   |   |   UIImageView:0x7fbce4b1fb00
|   |   |   |   |   UIImageView:0x7fbce4b1f910

Legend:
    * - is laid out with auto layout
    + - is laid out manually, but is represented in the layout engine because translatesAutoresizingMaskIntoConstraints = YES
    • - layout engine host

Но теперь у меня есть еще больше вопросов:

  • Может ли "неоднозначная компоновка" стать причиной такого странного поведения WKWebView?
  • Если так, как я могу решить эту двусмысленность?

Обновление 2:

Благодаря этому ответу я смог разрешить неоднозначную компоновку, и отладчик иерархии представлений доволен - но, к сожалению, это не решило проблему с веб-обзором - он все еще не отвечает на запрос loadFileURL!

1 ответ

ОК, наконец-то я нашел решение:

Я случайно создал новый объект ViewController вместо использования текущего экземпляра, и мой код инициализировал другое веб-представление на новом ViewController.

Так что я как-то потерял ссылку на старый и видимый веб-просмотр, и поэтому он больше не отвечал.

После использования правильного экземпляра все заработало. Но мне все еще интересно, почему это не привело к некоторым другим ошибкам, указывающим на это.

Другие вопросы по тегам