10
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”而终止应用程序,原因: '尝试插入非属性列表对象> for key webView' *First throw call stack: (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: terminating with uncaught exception of type异常

如何保存 WKWebView 并恢复其历史记录?

编辑:

8个月过去了,这个问题还没有解决...

编辑2:

我正在制作一个网络浏览器,当用户重新启动应用程序时,网络视图(选项卡)要恢复,这样他就可以按下后退按钮并返回,这一点至关重要。

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

standardUserDefaults 方法确实适用于 UIWebView,但 Apple 声明所有开发人员都应在 iOS 7 发布后使用 WKWebView。我预计 UIWebView 将在不久的将来被弃用。

4

4 回答 4

20

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

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

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

因为这些 URL 需要是同源的,所以我们基本上会推送 ` http://localhost:1234/history/item?url=http://original.url.com 这样的 url

在我们的 UI 中,我们将其转换为 display original.url.com。当用户返回历史加载这些内容时,我们拦截而不是从本地主机加载页面,而是加载原始页面。

这是一个很大的技巧,但这就是我们目前所拥有的。

在https://github.com/mozilla/firefox-ios查看源代码

于 2015-07-21T11:54:19.830 回答
8

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

NSArray
NSData
NSDate
NSDictionary
NSNumber
NSString

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

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

您可以参考文档以获取更多详细信息

于 2014-11-08T13:22:32.800 回答
4

正如@fonix提到的,您只能在NSUserDefault.

如果您只想要 url,将其转换为字符串并将其保存为NSUserDefaults.

然而,问题的症结在于如何“恢复原貌” WKWebview

因为,要“保存”网络视图,您不仅希望显示当前 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 来模拟历史记录。

希望这可以帮助!

于 2015-07-17T05:11:11.563 回答
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];
于 2014-11-08T13:35:33.967 回答