簡體   English   中英

為什么我無法將WKWebView保存到[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加載頁面,我們會加載原始頁面。

這是一個很大的黑客,但這就是我們現在所擁有的一切。

請參閱https://github.com/mozilla/firefox-ios上的源代碼

您只能在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM