問題タブ [nsurlcache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - UIWebView と NSURLCache の関係に問題がある
私は私の中で2つのことを解決しようとしていUIWebView
ます:
- 適切な条件下で、リモート アセットの代わりにローカル アセットをロードする
- ローカルアセットがない場合、または古い場合は、通常どおりリモートアセットをロードします
- サーバーからhtmlをリロードする必要なく、webviewが「戻る」ことを許可します
#1 と #2 を処理するために、カスタム サブクラスを実装しましたNSURLCache
。WebView がアセットをリクエストしたときに呼び出され、代わりにローカルのものを送信して、アセットのサーバー呼び出しを中止できます。ローカル バージョンが古いかどうか、またはどれを使用するかを判断できないかどうかを知る、ちょっとしたタイムスタンプ システムもあります。
しかし、#3は私をループに投げ込んでいます。キャッシュ制御ヘッダーに関係なく、UIWebView
戻るときに常に HTML をリロードするようです。
そこで、カスタムNSURLCache
クラスで HTML を強制的にキャッシュしようとしました。NSCachedURLResponse
動作しているようで、必要なHTMLのインスタンスを返しますがUIWebView
、サーバーからそれを認識してロードすることに失敗します。いくつかの検索の後、URL キャッシュに「矛盾」がいくつかあることがわかりましたUIWebView
。これはその 1 つだと思います。アセットには最適ですが、表示しようとしているページを構成する HTML にはあまり適していません。
それで、これはうまくいかないかもしれないので、手動で行うことにしました。URL のスタックと、手動でフェッチしてロードするデータを作成しましたloadData:MIMEType:textEncodingName:baseURL:
。見よ、それはうまくいったようだ!これで戻ることができ、Web ビュー デリゲートが負荷をインターセプトし、代わりに手動で取得したデータを読み込むように指示し、サーバーがヒットすることはありませんでした。
しかし、NSURLCache がアセットに使用されなくなっていることに気付きました。loadRequest:
セットを使用してデータまたは html 文字列をbaseUrl
適切にロードするのではなく、コンテンツをロードする場合にのみ、キャッシュされたアセットを要求するようです。
したがって、私の努力にもかかわらず、Webビューに条件付きでローカルアセットをロードさせ、サーバーにアクセスせずに戻ることはできません。SDK にいくつかのバグがあるようです。
UIWebView
Cache-Control
HTML コンテンツのサーバー ヘッダーを無視します。UIWebView
はNSCachedURLResponse
、メインの HTML リクエストに対して を要求しますが、無視されて破棄されます。UIWebView
はNSURLCache
、リクエストでロードする場合はアセットを要求しますが、HTML またはデータをロードする場合は、キャッシュを完全にバイパスし、リモート サーバーから直接リクエストします。
まず最初に、これらの問題に対する解決策を見つけた人はいますか? 次に、私が愚かであり、これらが実際には SDK のバグではない理由はありますか?
nsurlconnection - 可変NSHTTPURLResponseまたはNSURLResponse
NSURLResponseの応答ヘッダーを変更する必要があります。これは可能ですか?
iphone - NSURLCache メモリ サイズがゼロです
同期呼び出しを使用して NSURLConnection 応答をキャッシュするのに問題があります。あるクラスでキャッシュを初期化し、それを別のクラスで使用します。キャッシュ メモリの容量が 100KB に初期化された後、魔法のようにゼロにリセットされることに注目してください。
別のクラスで...
objective-c - 自動解放されたオブジェクトで NSURLCache がクラッシュするが、それ以外の場合はリークする
CSURLCache
はオフライン ブラウジング用のリソースをキャッシュするように設計されており、NSURLCache
データはメモリ内にのみ保存されます。
cachedResponse
アプリケーションがクラッシュする前に自動解放された場合、そうでない場合、オブジェクトは単にリークされます。
これに当てられる可能性のある光は大歓迎です。
stringByEncodingURLEntities
上のカテゴリ方法ですのでご注意くださいNSString
。
更新: Apple にレーダーを送信したところ、これは既知の問題であることがわかりました (レーダー #7640470)。
iphone - iPhone: NSURLRequestCachePolicy 設定のパフォーマンスの違い
iPhone でNSURLRequestを使用する場合、さまざまなNSURLRequestCachePolicy設定間の実際のパフォーマンスの違いは何ですか? UIWebView ページの表示速度に対するユーザーの認識に対するキャッシュ ポリシーの影響に特に関心があります。
私はデフォルトを使用してきましたNSURLRequestCachePolicy
が、おそらく NSURLRequestReloadRevalidatingCacheData がほとんどの場合、特に前のページに戻るときに最適であると思います。
実際の条件下でさまざまなキャッシュ ポリシーを使用した場合、特定の状況で最適であると証明されたポリシーはどれですか? 3 つの異なるタイプの iPhone 接続、wi-fi、3G、および Edge で最高の全体的なパフォーマンスを提供するポリシーはどれですか? キャッシュ ポリシーは、ページの読み込み速度に対するユーザーの認識に大きな影響を与えますか?それとも、UIWebView の表示時間を最適化するために別の方法を検討する必要がありますか?
アップデート:
UIWebView は、指定された NSURLRequest のキャッシュ設定を無視するように見えるというコンセンサスがあるようです。これが最終的な答えであるという完全な自信はありませんが、大規模なテストを行う時間がなければ、それを否定することはできません. したがって、私は最高評価の回答を受け入れます。ただし、問題がプロジェクトにとって重要である場合は、回答を一粒の塩で取ることをお勧めします. -- TechZen.
iphone - NSURLCache キャッシュ応答の問題
私は iPhone アプリケーションを作成しています。そのタブの 1 つは Twitter フィードです。Twitter xml を解析して、テーブル ビュー内に適切に配置しています。インターネット接続がない場合は、最後にインターネット接続があり、テーブルが更新されたときのキャッシュ結果を表示したいと思います。私はそのために NSURLCache を使用しています:
この Web サイト ( http://www.twitter.com/.. ) に初めてアクセスしたので、初めて NSLog が「応答がありませんでした」を出力することがわかります。また、応答がキャッシュされていることもわかります。 initWithRequest が起動された後に呼び出される willCacheResponse メソッドを実装したため、次のようになります。
このサイトに 2 回目にアクセスすると、NSLog が "Got Response" を出力することがはっきりとわかります。これは、キャッシュ ヒットがあったことを意味します。キャッシュから情報を取り出し、代わりに再度キャッシュしようとします。
この問題の原因は何ですか?
ありがとう!
cocoa - Safari の NSURLCache ストアを共有するにはどうすればよいですか?
バックグラウンド
最近一緒に訪れた Web ページをリンクするアプリを作成しています。
これを行うには、Cocoa を使用して最近の URL の HTML を取得する必要があります。
現在、これを行うために非表示の WebView を使用しています。
私が理解しているように、URL がアプリのキャッシュにない場合、これは Web サーバーにヒットしています。
私が欲しいもの
ページが既にアクセスされているため、取得している URL が Safari によって既にキャッシュされている可能性が高くなります。
アプリで最初に URL の Safari のキャッシュをチェックするようにします。そこにある場合は、このデータを使用するだけです。そうでない場合は、Web サーバーにヒットし、ページをアプリのキャッシュに保存する必要があります。
sqlite3 を使用して Safari から cache.db ファイルを解析する必要はありません。この形式が同じままかどうかはわかりません。私は、よりシンプルでより高レベルなものを求めています。
私が試したこと
メソッドを使用して独自の NSURLCache を設定できることは知っていますがinitWithMemoryCapacity:diskCapacity:diskPath:
、書き込みによって Safari が台無しになる場合に備えて、これを Safari キャッシュにポイントしようとはしません。
Safari キャッシュを共有する簡単で高度な方法はありますか?
アップデート
あはは。私が見逃していたこれを行う方法があるかもしれないことに気づきました。
withの新しいインスタンスを作成NSURLCache
しinitWithMemoryCapacity:diskCapacity:diskPath:
、それを Safari キャッシュにNSURLRequestReturnCacheDataDontLoad
向けて、ページのロード時に URL リクエストのキャッシュ ポリシーを指定できます。
これが失敗した場合は、通常どおりページを読み込んでみることができます。これを試して、詳細がわかったら質問を更新します。
iphone - カスタムNSProtocolとiPhoneでのキャッシュに関する問題
私のiPhoneアプリには、登録したカスタムNSProtocolハンドラーを介してhtmlをロードするUIWebViewが埋め込まれています。
私の問題は、返されたhtmlで参照されているリソースがキャッシュされ、再ロードされないことです。特に、私のスタイルシートはキャッシュされます:
UIWebViewにhtmlをロードする最初のリクエストは次のようになります。
(キャッシュポリシーは無視するように設定されていることに注意してください。このキャッシュポリシーが、初期ロード時にページリソースの後続の要求に引き継がれることを確認しました)
プロトコルハンドラーはデータベースからhtmlをロードし、次のようなコードを使用してクライアントに返します。
(応答キャッシュポリシーは「許可されていない」ことに注意してください)。
styles.cssリソースをキャッシュしないようにする方法はありますか?このファイルを参照するhtmlの後続のロードで、このリソースのコンテンツを動的に変更できる必要があります。
共有URLキャッシュをクリアすることは機能すると思いましたが、機能しません。
動作するものの1つは、非常に非効率的です。タイムスタンプパラメータを追加して、スタイルシートのURLを動的にキャッシュバストすることです。
これを機能させるには、データベースからhtmlをロードし、スタイルシートのURLを検索して、リクエストごとに変更されるキャッシュ無効化パラメーターに置き換える必要があります。私はむしろこれをしたくない。
組み込みのHTTPプロトコルを介してコンテンツをロードしても問題はないと思います。その場合、UIWebViewはNSURLHTTPResponseオブジェクトのhttpヘッダー内のCache-Controlフラグを調べ、それらを順守していると思います。私のNSURLResponseObjectにはhttpヘッダーがないので(http ...ではありません)、おそらくUIWebViewはリソースをキャッシュすることを決定します(NSURLRequestキャッシングディレクティブを無視しますか?)。
アイデア???
iphone - UIWebView NSURLRequestReloadIgnoringLocalCacheData は実際にはキャッシュを無視しません
NSURLRequestReloadIgnoringLocalCacheData として指定されたキャッシュ ポリシーを持つ UIWebView オブジェクトがあります。
これにより、ローカル キャッシュにあるオブジェクトはすべて無視され、Web からサイトの最新バージョンが取得されます。
ただし、サイトの最初の読み込み (トレースで 10 個のリソース、HTTP GET) の後、サイトの後続のすべての読み込みでは、リソースの小さなサブセット (トレースで 3 つのリソース、HTTP GET) のみを取得します。画像はすべて、ローカル ソースから読み込まれたように見えます。
私の sharedURLCache のメモリ使用量は 0 バイトで、ディスク使用量も 0 バイトであることを確認しました。プロセスが新たに開始されるたびに、サイトのフル バージョンが再度取得されます。これにより、これらのリソースはメモリ内キャッシュに格納されていると思われますが、前に述べたように、[[NSURLCache sharedURLCache] currentMemoryUsage] は 0 を返します。
また、リクエストに対してキャッシュされたレスポンスを明示的に削除しようとしましたが、これは効果がないようです。何を与える?
編集: さらに、各ロードの前に NSHTTPCookieStorage がクリアされ、その後のロードで 3 つではなく 4 つのリソースが取得されることが確認できます。変更に関係なく、キャッシュの問題は解決しません。
uiwebview - iPhone での UIWebView の URL フィルタリング
誰かが私がこれをどのように機能させるかについていくつかの光を当てることができますか: http://www.icab.de/blog/2009/08/18/url-filtering-with-uiwebview-on-the-iphone/
プロジェクトで「FilteredWebCache.h」と「FilteredWebCache.m」ファイルを作成しようとしましたが、「FilterManager.h」が存在しないと表示されました。それらのファイルで何をするつもりですか?
これをviewDidLoadに入れました: