为什么我无法将WKWebView保存到[NSUserDefaults standardUserDefaults]?

时间:2014-11-08 13:02:05

标签: ios objective-c iphone nsuserdefaults wkwebview

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]尝试   设置非属性列表对象>作为一个   NSUserDefaults / CFPreferences值为关键webView 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:

我正在制作网络浏览器 ,当用户重新启动应用时,网页浏览器(标签)要恢复,这是至关重要的,这样他就可以按下按钮然后返回。

如果我将以前的网址保存在一个简单的列表中,我就无法在应用重新启动时将它们放回网页视图中。我只能加载第一页。因此,用户无法回退,因为没有要回页的页面。如果它像保存网址列表一样简单我就不会开始赏金。因为,Web浏览器是一个非常复杂的应用程序,我已经非常接近webViews的基础知识,我甚至提交了3个错误,其中只有2个已经解决。包括臭名昭着的screenshot bug

standardUserDefaults方法可以与UIWebView一起使用,但Apple声明所有开发人员都应该在iOS 7发布之后使用WKWebView。我希望在不久的将来弃用UIWebView。

4 个答案:

答案 0 :(得分:19)

这里没有简单的答案。 WKWebView无法存档,也不参与UI状态保存/恢复。你已经发现了这个。

对于Firefox for iOS,我们采取了不同的方法来解决这些限制。这远非理想,但确实有效。

当我们恢复附加了会话信息(以前访问过的页面)的选项卡时,我们从本地Web服务器(在localhost上运行)加载一个特殊的html页面,该页面修改页面的推送状态并推送以前访问过的URL。历史堆栈。

因为这些网址需要来源相同,所以我们基本上会推送像“http://localhost:1234/history/item?url=http://original.url.com

这样的网址

在我们的用户界面中,我们将其翻译为显示original.url.com。当用户返回历史记录加载这些内容时,我们会拦截而不是从localhost加载页面,我们会加载原始页面。

这是一个很大的黑客,但这就是我们现在所拥有的一切。

请参阅https://github.com/mozilla/firefox-ios

上的源代码

答案 1 :(得分:8)

您只能在NSUserDefaults中存储某些类型的对象,即

NSArray
NSData
NSDate
NSDictionary
NSNumber
NSString

(你不能通过将你的webview放在NSArray中来绕过这个)

您可以做的是在NSDictionary中存储有关webview的相关信息,这样您就可以在从NSUserDefaults加载时将webview恢复到当前状态

您可以参考the documentation了解更多详情

答案 2 :(得分:4)

作为@fonix mentioned,您只能在NSUserDefault中存储少数数据类型。

如果您只是想要网址,将其转换为字符串并将其保存到NSUserDefaults非常容易。

然而,问题的关键在于如何恢复WKWebview及其历史完整。"

因为,拯救'在网络视图中,您不仅需要显示当前网址,还需要显示历史记录,您需要访问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];

将这些网址保存到NSArray,您可以将其保存到NSUserDefaults

然后当你想重新创造' webview,遍历此数组并请求每个url模拟历史记录。

希望这有帮助!

答案 3 :(得分:3)

如果你真的想要用户默认的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];