2017-10-20 10 views
0

私はブラウザアプリケーションを開発しています。私は、WKWebViewオブジェクトを再起動するときに復元したいと思います。 WKWebViewオブジェクトをシリアライズしてレルムに保存しました。しかし、私はWKWebViewオブジェクトを逆シリアル化したとき、urlとbackListのデータはWKWebViewから失われました。デシリアライズされたWKWebViewからURLが削除される理由

let WebView = WKWebView() 
WebView.frame = CGRect(x: 0, y: 0, width:300, height:650) 
let urlString = "http://www.google.com" 
let encodedUrlString = urlString.addingPercentEncoding(withAllowedCharacters:NSCharacterSet.urlQueryAllowed) 
let url = NSURL(string: encodedUrlString!) 
let request = NSURLRequest(url: url! as URL) 
WebView.load(request as URLRequest) 

let serialized_WebView = NSKeyedArchiver.archivedData(withRootObject: WebView) as NSData //convert to NSData 
let deserialized_WebView = NSKeyedUnarchiver.unarchiveObject(with: serialized_WebView as! Data) as! WKWebView 

print("frame",deserialized_WebView.frame) // frame (0.0, 0.0, 300.0, 650.0) 
print("url",deserialized_WebView.url) // url nil 
print("backList",deserialized_WebView.backForwardList.backList) // backList [] 

私は、WKWebViewオブジェクトの一部としてurlだけでなく、backListを復元したいと思います。私はできるだけバックリストを保存するというユニークな機能を実装したくありません。

お願いします。

答えて

3

これまでにの表示をエンコードした人は、まったく見たことがありません。一般に、ビューのNSCodingへの準拠はInterface Builderでの使用を意図しており、設定可能なプロパティはおそらくそこに公開されます。

インターフェイスビルダを参照すると、シリアル化されたプロパティは、ナビゲーションジェスチャ、ユーザーエージェント、リンクプレビュー、および一連のプロパティであるWKWebViewConfigurationです。ブレークポイントで、これがすべてエンコードされていることを確認しました。

backListは、ある時点のビューの状態を表し、UIKitの状態復元プロセスで使用するために符号化されているとWKWebView.encodeRestorableState(with:)になります。残念ながら、このメソッドは実装されておらず、状態は保存されません。 this answerでは、Webビューでヒストリを再構築する場合は、UIWebViewを使用することをお勧めします。

さらに複雑なアプローチは、iOS向けのFireFoxの機能です。彼らは、カスタムWebリクエストサーバーとJavaScriptのhistory.pushStateを介して履歴にURLを挿入するWebページを使って、WKWebViewの履歴を正常に復元します。関連するコードは次のとおりです。

  • Tab.restore(_:WKWebView):コードはURLの配列をとり、ローカルWebサーバーに渡します。
  • SessionRestoreHandler:Webページを返すローカルWebサーバーの要求ハンドラ。
  • SessionRestore.html:JavaScriptを使用して履歴を注入するリクエストハンドラによって処理されるファイル。

この方法は、ブラウザの主要なプレイヤーの1人にとってはうまくいくかもしれませんが、ほとんどのアプリでは問題にはならないでしょう。私は個人的には、ちょうどUIWebViewとマットのような状態の復元を固執することをお勧めします。

関連する問題