我正在編寫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的子類,實現自定義緩存並在應用程序中執行加載邏輯(離線與在線)。如果可能的話,我寧願使用標準方法。