8

私は自分のアプリで AFNetworking を使用しており、利用可能な場合はキャッシュされたデータを使用してオフライン モードで動作させようとしています。

要求キャッシュ ポリシーを NSURLRequestReturnCacheDataDontLoad に設定した後、getPath:parameters:success:failure: がオフライン時にキャッシュされたデータで成功すると予想しました。ただし、キャッシュにデータがあっても(コードでキャッシュをチェックして確認しました)、機内モードでは getPath は単に失敗します。

AFNetworking github にスレッドがありました: https://github.com/AFNetworking/AFNetworking/issues/378 しかし、問題はまったく解決されていないようです。AFNetworking の作成者は、単にApple のドキュメントを指し示し、次のように述べています。

NSURLRequestReturnCacheDataDontLoad 経過時間や有効期限に関係なく、リクエストを満たすために既存のキャッシュ データを使用する必要があることを指定します。URL 読み込み要求に対応する既存のデータがキャッシュに存在しない場合、元のソースからのデータの読み込みは試行されず、読み込みは失敗したと見なされます。この定数は、「オフライン」モードに似た動作を指定します。

Apple が言ったように、NSURLRequestReturnCacheDataDontLoad はまさにオフライン モード用に設計されています。

私は iOS6 でテストしています。NSURLCache と SDURLCache の両方でテストしましたが、結果はすべて同じでした。

リクエストが失敗しました。エラー メッセージ:

2012-12-22 03:11:18.988 Testapp[43692:907] エラー: エラー Domain=NSURLErrorDomain Code=-1009 「インターネット接続がオフラインのようです。」UserInfo=0x211b87c0 {NSErrorFailingURLStringKey=http://Testapp.com/api/v1/photo/latest/, NSErrorFailingURLKey=http://Testapp.com/api/v1/photo/latest/, NSLocalizedDescription=インターネット接続はoffline., NSUnderlyingError=0x211b9720 "インターネット接続がオフラインのようです。"}

4

1 に答える 1

7

結局のところ、これは iOS 6 のバグです。

この問題については、AFNetworking にディスカッション スレッドがあります: https://github.com/AFNetworking/AFNetworking/issues/566

この問題に関する Guykogus のヒントと実験に感謝します。私はこの問題に一晩を費やしました!

要約された回避策は、NSURLRequestReturnCacheDataDontLoad ポリシーを使用する代わりに、キャッシュから応答を読み取ることです。

NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
if (cachedResponse != nil &&
    [[cachedResponse data] length] > 0)
{
    // Get cached data
    ....
}
于 2012-12-22T21:53:41.163 に答える