为什么我不能将WKWebView保存到?

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; [prefs setObject:self.webView forKey:@"webView"]; 

上面的代码是保存一个WKWebView对象,但我得到一个编译器错误:

2014-11-08 14:58:52.561恢复[2431:482391]属性列表格式无效:200(属性列表不能包含CFTypetypes的对象)2014-11-08 14:58:52.564恢复[2431:482391 ]试图设置一个非属性列表对象>作为关键的webView的NSUserDefaults / CFPreferences值2014-11-08 14:58:52.566恢复[2431:482391] *终止应用程序由于未捕获的exception“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:以NSExceptiontypes的未捕获exception终止

我怎样才能保存WKWebView并恢复它的历史不变?

编辑:

8个月过去了,这个问题没有解决办法…

编辑2:

我正在做一个网页浏览器 ,这是至关重要的,当用户重新启动应用程序的Web视图(标签)来恢复,所以他可以按下后退button,并返回。

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

standardUserDefaults方法可以和UIWebView一起工作,但是Apple声明所有开发者都应该在iOS 7发布之后使用WKWebView。我期待UIWebView在不久的将来会被弃用。

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

对于Firefox的iOS版本,我们采取了不同的路线来解决这些限制。 这远非理想,但确实奏效。

当我们恢复一个带有会话信息(以前访问过的页面)的标签页时,我们从本地web服务器(运行在本地主机上)加载一个特殊的html页面,修改页面的推送状态,并推送历史堆栈中以前访问过的URL。

由于这些url需要具有相同的来源,因此我们基本上会像“ http:// localhost:1234 / history / item?url = http://original.url.com

在我们的用户界面,我们翻译这个显示original.url.com 。 当用户回到历史logging加载这些,我们拦截,而不是从本地加载页面,我们加载的原始页面。

这是一个很大的黑客,但这是我们在这一点上。

请参阅https://github.com/mozilla/firefox-ios上的源代码

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

 NSArray NSData NSDate NSDictionary NSNumber NSString 

(你不能绕过这个把你的webview在一个NSArray中)

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

你可以参考文档了解更多细节

如果你真的想从用户默认的webview,这是一个select。

 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]; 

正如@fonix所提到的 ,你只能在NSUserDefault存储一些选定的数据types。

如果你只是想要的url,将它转换为一个string,并将其保存到NSUserDefaults是相当容易的。

但问题的关键在于如何“恢复WKWebview的历史”。

由于要“保存”networking视图,不仅要显示当前的URL,还要显示历史logging,您需要访问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


然后,当你想'重新创build'webview,遍历这个数组,请求每个url来模拟历史。

希望这可以帮助!