13

メソッドUIWebViewを壊さずにカスタムHTMLをロードするのに問題があります。goBack

何が機能するか

UIWebViewカスタムHTMLをロードできるように、自分のURLリクエストをインターセプトしています。私はすべてのHTMLを制御できるので、特別なアプリリクエストmyapp://arg1/?arg2=valで解析可能なカスタムスキーム(つまり)を使用するようにしていwebView:shouldStartLoadWithRequest:navigationType:ます。本当にロードして呼び出し、元のリクエストをキャンセルするためにloadHTMLString:baseURL戻るHTMLを決定します。NO

動作しないもの

上記はうまくいきます。UIWebView's goBack問題は、このメソッドを利用したいので、履歴スタックに追加するloadRequest:唯一のメソッドのように見えることです。UIWebView

私にはいくつかのアイデアがありますが、どれが実行可能で、どのようにそれらを実行するのかわかりません。YES主なことは、私が戻って来なければならず、の方法webView:shouldStartLoadWithRequest:navigationTypeを使わなければならないということのようです。UIWebViewloadRequest

アイデア1:NSURLRequest /Responseを変更する: (UIWebViewがリクエストを行うときに)実際にHTTPリクエストを行わず、HTMLを含むNSURLResponseを返すようにNSURLRequestをサブクラス化できますか?または、何らかの方法でNSURLResponseにカテゴリメソッドを変更/サブクラス化/追加しますか?私はそれが本当のリクエストであるという考えが好きですが、プライベートAPIが心配で、AppStoreから拒否されます。

アイデア2:カスタムURLプロトコルを処理するカスタムURLプロトコル を登録して、アプリがそれに応答し、正当なNSURLResponse(カスタムHTMLで埋められている)を返すようにします。

アイデア3:キャッシュをだますこのキャッシュポリシーNSURLRequestReturnCacheDataDontLoadを使用してリクエストを作成し、WebViewとキャッシュの間にHTMLを挿入しますか?

それとも私は完全に間違った方向に進んでいますか?

4

3 に答える 3

7

私が試したもう1つの非常に巧妙なアプローチがありNSURLCacheます。ナビゲーション履歴コード全体をいじったり書き直したりする代わりに、HTTPリクエストが行われるたびNSURLProtocolに標準で使用されるカスタムを作成するだけです。NSURLConnectionそこで、データをロードするための独自NSURLRequestのデータを作成し、MIMEタイプを検査したり、リクエストのコンテンツを変更したり、データをディスクにキャッシュしたりできます。このアイデアは、RobNapierの好意によるものです。

http://robnapier.net/blog/offline-uiwebview-nsurlprotocol-588

彼のコードは現在GitHubにもあります:

https://github.com/rnapier/RNCachingURLProtocol

于 2012-07-11T11:22:46.103 に答える
5

I'd first try to go route #3. Maybe "Substituting local data for remote UIWebView requests" on Cocoa with Love is helpful for you.

于 2011-01-31T11:06:45.800 に答える
1

上記のアプローチのいずれにも反対することをお勧めします。

#3は機能しましたが、非常に壊れやすく、デバッグが困難でした。(たとえば、Appleは破棄して再作成するNSURLRequestsため、NSURLRequestをサブクラス化して、後続の応答で実行されることを期待することはできません。)

結局、私自身の過去の履歴を(はるかに)簡単にし、どのページをロードしてスクロール位置(垂直画面オフセット)にするかをメモすることができました。

于 2011-11-23T18:31:16.423 に答える