2016-05-04 11 views
1

私はオンラインとオフラインの両方で機能するOS X HTML5アプリを書いています。オフラインアプリケーションキャッシュはthisに基づいて試作され、Safariでうまく機能します。 Xcodeでwebviewを使用して簡単なテストを行うと、マニフェストファイルがwebviewによってフェッチされないようです。Mac OS Xでのオフラインアプリケーションキャッシュのサポート埋め込みWebkit webview

<html manifest="example.manifest"><head> <title>Test with 
manifest</title> </head> <body> Test with manifest<br> <br> 
</body></html> 

マニフェストファイルexample.manifestが含まれています:

CACHE MANIFEST 
# ver 1 
CACHE: 

私は、Safariでページのロードをこのページを表示すると、マニフェストが読み込まれているテストする簡単な方法は、この最小限のhtmlファイルを使用しています。私がサファリをやめ、オフラインにしてからSafariを起動してこのページを更新すると、キャッシュからロードされます。ここのオフラインキャッシュは正常に動作しているようです。ウェブビューで

class ViewController: NSViewController { 
@IBOutlet var webview: WebView! 

let THEURL:String = "http://192.168.23.180/WithManifest/" 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let url = NSURL(string: THEURL) 
    let request = NSURLRequest(URL: url!, cachePolicy:NSURLRequestCachePolicy.UseProtocolCachePolicy ,timeoutInterval: 10) 
    webview.mainFrame.loadRequest(request) 
    } 
} 

:次のコードを(ストーリーボードは、ウィンドウの内部ビューコントローラのWebビューを有する)を用い

iはXcodeの7.3で、Webビューでこれを繰り返すのMac OS 10.11、ページが正常に読み込まれますが、終了してオフラインで再起動すると、ページが読み込まれません。ネットワークトラフィックを見ると、マニフェストファイルがクライアントから決して要求されないことは明らかです。私は成功せずにすべての異なるキャッシュポリシーを試しました。私は自分の共有URLキャッシュを作成しようとしましたが、他の場所では成功していません。

let cacheSizeMemory:Int = 4*1024*1024; // 4MB 
    let cacheSizeDisk:Int = 32*1024*1024; // 32MB 
    let sharedCache:NSURLCache = NSURLCache(memoryCapacity:cacheSizeMemory, diskCapacity:cacheSizeDisk, diskPath:"nsurlcache") 
    NSURLCache.setSharedURLCache(sharedCache) 

私の質問:

1)HTML5で説明したようにOS Xのサポートオフラインアプリケーションキャッシュ内のWebKitのWebViewのはいますか?

2)「はい」の場合は、動作させるためには何が必要ですか?

私の回避策は、カスタムキャッシュを実装し、アプリケーションでロードロジック(オフラインとオンライン)を実行するNSURLProtocolのサブクラスを実装することです。可能であれば、私はむしろ標準的なアプローチをむしろ使用します。

答えて

1

私は、さまざまな場所や人々の助けを借りて、答えを見つけることができました。 setOfflineWebApplicationCacheEnabledというObjective-C Webviewの設定があります。これは何らかの理由で迅速に公開されません。動作させるには、まずブリッジヘッダーファイルを作成します。 Xcodeを使用してヘッダファイルを作成し、これを次のように入力します。

#import <Foundation/Foundation.h> 
#import <WebKit/WebKit.h> 

@interface WebPreferences (WebPreferencesPrivate) 
- (void)_setLocalStorageDatabasePath:(NSString *)path; 
- (void) setLocalStorageEnabled: (BOOL) localStorageEnabled; 
- (void) setOfflineWebApplicationCacheEnabled:(BOOL)offlineWebApplicationCacheEnabled; 
- (void) setDatabasesEnabled:(BOOL)databasesEnabled; 
@end 

プロジェクトで保存します。ビルド設定 - >スウィフトコンパイラ - コード生成に行き、 'Objective C Bridging Header'を選択します。右側をダブルクリックし、ヘッダーファイルに相対パス(プロジェクトの組織ではなくファイルシステムに基づく)を入れます。私の場合、それはtestwebviewmanifest/Header.hで、testwebviewmanifestフォルダは.xcodeprojファイルと同じレベルにあります。

これが完了したら、正常にビルドできます(パスが間違っているとヘッダファイルが見つからないという不満があるかもしれません)。この行は、Webviewのハンドルがあるスタートアップ場所に置いてください。私にとってはViewControllerに入れるのは簡単でした。

webview.preferences.setOfflineWebApplicationCacheEnabled(true) 

これが完了すると、キャッシュマニフェストがダウンロードされ、アプリケーションキャッシュが問題なく動作しているように見えます。大規模なテストはまだ行われていません。見つけたものがあれば更新します...

デモプロジェクトはこちらからhttps://github.com/graySquirrel/testwebviewmanifest

関連する問題