Swift

Swift:これはマズイ!ドツボの中→loadData

昨日の解決策を糸口に出口を模索中。

腑に落ちない点があることと、昨日の解決策を持ち込んだとしてもロジックが複雑でスイッチだらけになるので、単純化する方法を考えています。

完全に問題を解消するには、もう何日かかかりそうです。いい線まで来ているのですが、まだgoを出せません。

追記1:メモリの懸念が残りますが、save/restoreの単体デバッグの結果はOKになりました。もう少しです。

追記2:もしかすると、欲しかった答えにたどり着いたかもしれません。wdomDoc.webArchive.dataは、mainFrame.loadDataでWebViewに入れることができます。

How can I load a .webarchive into a UIWebView from an in-memory NSData?にThe MIME type specified must be application/x-webarchive (not the generic “octet-stream”). If this is set correctly, both the text encoding and base URL can be just supplied as nil.とありました。

🔶実装1

@IBOutlet var   xWebView:WebView?

let wdomDoc:DOMDocument = xWebView?.mainFrameDocument as DOMDocument!
let wData:NSData = wdomDoc.webArchive.data
xWebView?.mainFrame.loadData(wData, MIMEType:“application/x-webarchive”, textEncodingName:nil, baseURL:nil)

🔶実装2

実装1を試してみました。これでいいようです。NSDataをWebViewに入れた後、ブランクページが表示されてしまう問題を調査しています。
➡️原因判明:baseURLをnilにしていることと関係がありそうです。wdomDoc.webArchive.dataをsaveして、これをWebViewに戻した後、.webarchiveファイル相当が表示されているにもかかわらず、xWebView?.mainFrameURLはabout:blankになります。

🔶実装3

baseURLに適当なものを入れたらどうなるか?
➡️あっ、こうすれば、about:blankにならず、wdomDoc.webArchive.dataをsaveして、これをWebViewに戻した後、.webarchiveファイル相当を読み込んだかのようになりますね。設定したURLは暫定的なもの(tempで使うつもり用意したもので、実際にはファイルの読み書きは行っていません)。設定時に、論理的に正しいファイル名を設定すればいいことになります。そうすれば、あたかも、.webarchiveファイルを読みだしたかのような挙動をさせることが可能になります。

🔶実装4

xWebView?.mainFrame.loadData(wData, MIMEType:“application/x-webarchive”, textEncodingName:nil, baseURL:pNSURL)

pNSURLはメモリモードでなく、ファイルモードのときの.webarchiveファイルのNSURLになります。