wkwebview と ios 10.3 と swift 3 で奇妙な動作をします。
wkwebview を使用して、ローカルの html ファイル (アプリケーション サポートの下) を表示しています。最初の起動時にはすべてが機能し、ローカル Web サイト (js および css を含む) は正常に機能します。しかし、インターネットからコンテンツの更新をフェッチすると (これには html ディレクトリの削除と新しいファイルの抽出が含まれます)、webview はファイルをロードしません。既存の webview を再利用しようとすると、次のようになります。
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の変更なし、エラーなし、フリーズなし - ローカルWebサイトは通常どおり動作する (loadFileURL呼び出しを伴う機能を除く - しかし、このコードはios 9.3で動作し、ios 10で一度動作したと確信している.
wkwebviewの問題とスペースを含むファイルパスを伴うios 10.3ベータのバグについても知っていますが、ドキュメントディレクトリでこれをテストしても同じ結果が得られました。
しかし、しばらくすると、次のログ出力が得られました。
サービス com.apple.WebKit.Networking にシグナルを送信できませんでした: 113: 指定されたサービスが見つかりませんでした
この回答は、Webビューをサブビューとして正しく追加していないことに関連している可能性があることを示しています。しかし、ウェブビューをサブビューに追加する際に何か問題があったかどうかはわかりません...
アップデート
ビュー階層をさらにデバッグすると、「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:
この回答のおかげで、あいまいなレイアウトを解決でき、ビュー階層デバッガーは満足しています-しかし、残念ながらこれは webview の問題を解決しませんでした-まだ loadFileURL リクエストに応答しません!