[英]Settings.bundle … why can't my code access the values via [NSUserDefaults standardUserDefaults]?
[英]Why I can't save WKWebView to [NSUserDefaults standardUserDefaults]?
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:self.webView forKey:@"webView"];
上面的代碼用於保存WKWebView對象,但是我收到了編譯器錯誤:
2014-11-08 14:58:52.561恢復[2431:482391]屬性列表格式無效:200(屬性列表不能包含'CFType'類型的對象)2014-11-08 14:58:52.564恢復[2431:482391 ]嘗試將非屬性列表對象>設置為關鍵webView的NSUserDefaults / CFPreferences值2014-11-08 14:58:52.566恢復[2431:482391] *由於未捕獲的異常'NSInvalidArgumentException'而終止應用程序,原因: '嘗試將非財產清單對象>重點webView的' *第一擲調用堆棧:(0x2c491c1f 0x39c78c8b 0x2c491b65 0x2c4cbe51 0x2c436599 0x2c4358d7 0x2c4cc0d1 0x2c4cb769 0x2c4ce95b 0x2c4ce875 0x2d0eab69 0x66bdf 0x2f981c2b 0x2f981bd1 0x2f96c863 0x2f98163d 0x2f981317 0x2f97abe1 0x2f9513dd 0x2fbc4c29 0x2f94fe39 0x2c458377 0x2c457787 0x2c455ded 0x2c3a4211 0x2c3a4023 0x3379d0a9 0x2f9b01d1 0x66ead 0x3a1f8aaf)libc ++ abi.dylib:以NSException類型的未捕獲異常終止
如何保存WKWebView並將其恢復歷史記錄?
編輯:
8個月過去了,這個問題沒有解決方案......
編輯2:
我正在制作一個網絡瀏覽器 ,當用戶重新啟動應用程序時,網頁瀏覽(標簽)要恢復是至關重要的,這樣他就可以按下后退按鈕然后返回。
如果我將以前的URL保存在一個簡單的列表中,那么當應用程序重新啟動時,我無法將它們放回到Web視圖中。 我只能加載第一頁。 因此,用戶無法按回,因為沒有要回的頁面。 如果它像保存URL列表一樣簡單, 我就不會開始賞金 。 因為,Web瀏覽器是一個非常復雜的應用程序,我已經非常接近webViews的基礎知識,我甚至提交了3個錯誤,其中只有2個已經解決。 包括臭名昭着的截圖bug 。
standardUserDefaults方法可以與UIWebView一起使用,但Apple聲明所有開發人員都應該在iOS 7發布之后使用WKWebView。我期望在不久的將來棄用UIWebView。
這里沒有簡單的答案。 WKWebView無法存檔,也不參與UI狀態保存/恢復。 你已經發現了這個。
對於Firefox for iOS,我們采取了不同的方法來解決這些限制。 這遠非理想,但確實有效。
當我們恢復附加了會話信息(以前訪問過的頁面)的選項卡時,我們從本地Web服務器(在localhost上運行)加載一個特殊的html頁面,該頁面修改頁面的推送狀態並在歷史堆棧上推送先前訪問過的URL。
因為這些URL需要來源相同,所以我們基本上推送網址如` http:// localhost:1234 / history / item?url = http://original.url.com
在我們的用戶界面中,我們將其翻譯為顯示original.url.com
。 當用戶返回歷史記錄加載這些內容時,我們會攔截而不是從localhost加載頁面,我們會加載原始頁面。
這是一個很大的黑客,但這就是我們現在所擁有的一切。
您只能在NSUserDefaults中存儲某些類型的對象,即
NSArray
NSData
NSDate
NSDictionary
NSNumber
NSString
(你不能通過將你的webview放在NSArray中來繞過這個)
您可以做的是在NSDictionary中存儲有關webview的相關信息,這樣您就可以在從NSUserDefaults加載時將webview恢復到當前狀態
您可以參考文檔以獲取更多詳細信息
正如@fonix所提到的 ,您只能在NSUserDefault
存儲少數數據類型。
如果你只是想要url,將它轉換為字符串並將其保存到NSUserDefaults
會非常容易。
然而,問題的關鍵是如何“恢復WKWebview
的歷史完好無損”。
因為,要“保存”Web視圖,您不僅需要顯示當前URL,還需要顯示歷史記錄,您需要訪問backForwardList
上的WKWebview.
NSMutableArray *history = [NSMutableArray array];
for(WKBackForwardListItem *item in webview.backForwardList.backList){
// use -absoluteString to convert NSURL to NSString
[history addObject:[item.url absoluteString]];
}
[[NSUserDefaults standardUserDefaults] addObject:history forKey:@"webviewHistory"];
[[NSUserDefaults standardUserDefaults] synchronize];
將這些URL保存到NSArray
,可以將它們保存到NSUserDefaults
。
然后,當您想要“重新創建”webview時,遍歷此數組並請求每個url模擬歷史記錄。
希望這可以幫助!
如果你真的想要用戶默認的webview,這是一個選擇。
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:[NSKeyedArchiver archivedDataWithRootObject:self.webView] forKey:@"webView"];
// get it back from user default
NSData *data = [prefs objectForKey:@"webView"];
self.webView = [NSKeyedUnarchiver unarchiveObjectWithData:data];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.