2016-05-04 83 views
1

我正在編寫OS X HTML5應用程序,它必須同時在線和離線運行。離線應用程序緩存基於this原型,並在Safari中運行良好。當我在Xcode中使用webview進行簡單測試時,清單文件似乎永遠不會被webview獲取。一個簡單的方法來測試使用這個最小的HTML文件: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瀏覽器,頁面加載查看此頁面,清單讀。如果我退出safari,脫機,然後啓動Safari並刷新此頁面,它從緩存加載。這裏的脫機緩存似乎工作正常。

當我重複此使用Web視圖,在Xcode 7.3的Mac OS 10.11,使用以下代碼(故事板具有在視圖控制器窗口的內部的網絡視圖):

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視圖情況下,頁面加載正常,但在退出並重新啓動脫機後,頁面無法加載。查看網絡流量,很明顯清單文件從不被客戶端請求。我嘗試了所有不同的緩存策略,但都沒有成功。我也嘗試創建自己的共享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)確實在OS X支持離線應用程序緩存的WebKit的WebView在HTML5描述?

2)如果是,需要做些什麼才能使其工作?

我的解決方法是實現NSURLProtocol的子類,實現自定義緩存並在應用程序中執行加載邏輯(離線與在線)。如果可能的話,我寧願使用標準方法。

回答

1

我能夠在不同地方和人們的幫助下找到答案。有一個名爲setOfflineWebApplicationCacheEnabled的Objective-C webview首選項,它出於某種原因不能在swift中公開。爲了使它工作,首先建立一個橋接頭文件。使用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 

並將其保存在您的項目中。轉到Build Settings-> Swift Compiler - Code Generation並選擇'Objective C Bridging Header'。雙擊右側,並將相對路徑(基於文件系統,而不是項目組織)放到頭文件中。在我的情況下,它是testwebviewmanifest/Header.h,其中testwebviewmanifest文件夾與.xcodeproj文件位於同一級別。

一旦完成,你可以成功構建(它可能會抱怨說,如果路徑是錯誤的它找不到你的頭文件),把這一行放在你有一個處理你的web視圖的啓動地方。對我來說,很容易把它放在ViewController中。

webview.preferences.setOfflineWebApplicationCacheEnabled(true) 

一旦完成,緩存清單將被下載,並且應用程序緩存似乎可以完美地工作。廣泛的測試尚未完成。如果發現任何問題,我會更新...

演示項目可以在這裏找到:https://github.com/graySquirrel/testwebviewmanifest