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。
答案 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加载页面,我们会加载原始页面。
这是一个很大的黑客,但这就是我们现在所拥有的一切。
上的源代码答案 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];