Ios 为什么我能';是否将WKWebView保存到[NSUserDefaults standardUserDefaults]?
上面的代码是用来保存WKWebView对象的,但我遇到了一个编译器错误: 2014-11-08 14:58:52.561恢复[2431:482391]属性列表无效 对于格式:200(属性列表不能包含类型为的对象 “CFType”)2014-11-08 14:58:52.564恢复[2431:482391]尝试 将非属性列表对象>设置为 NSUserDefaults/CFKeyWebView的首选项值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浏览器,当用户重新启动应用程序时,关键是要恢复web视图(选项卡),这样他就可以按下后退按钮并返回 如果我将以前的URL保存在一个简单的列表中,当应用程序重新启动时,我无法将它们放回web视图。我只能加载第一页。因此,用户不能按back键,因为没有要返回的页面。如果它像保存URL列表一样简单,我就不会开始悬赏了。因为,web浏览器是一个非常复杂的应用程序,我已经非常接近WebView的基本原理,我甚至提交了3个bug,其中只有2个已经解决。包括臭名昭著的Ios 为什么我能';是否将WKWebView保存到[NSUserDefaults standardUserDefaults]?,ios,objective-c,iphone,nsuserdefaults,wkwebview,Ios,Objective C,Iphone,Nsuserdefaults,Wkwebview,上面的代码是用来保存WKWebView对象的,但我遇到了一个编译器错误: 2014-11-08 14:58:52.561恢复[2431:482391]属性列表无效 对于格式:200(属性列表不能包含类型为的对象 “CFType”)2014-11-08 14:58:52.564恢复[2431:482391]尝试 将非属性列表对象>设置为 NSUserDefaults/CFKeyWebView的首选项值2014-11-08 14:58:52.566恢复[2431:482391]*由于以下原因终止应用
standardUserDefaults方法确实适用于UIWebView,但苹果表示,在iOS 7发布后,所有开发人员都应该使用WKWebView。我预计UIWebView在不久的将来会被弃用。您只能在NSUserDefaults中存储某些类型的对象,即
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:self.webView forKey:@"webView"];
(将webview放在NSArray中无法绕过此问题)
您可以做的是将有关webview的相关信息存储在NSDictionary中,这样您就可以在从NSUserDefault加载时将webview恢复到当前状态
有关更多详细信息,请参阅,如果您确实希望使用用户默认设置的webview,这里有一个选项
NSArray
NSData
NSDate
NSDictionary
NSNumber
NSString
作为@fonix,您只能在NSUserDefault
中存储部分数据类型
如果您只需要url,那么将其转换为字符串并将其保存到NSUserDefaults
将非常容易
然而,问题的关键是如何“恢复WKWebview
的历史完整性。”
由于要“保存”web视图,您不仅需要显示当前URL,还需要显示历史记录,因此需要访问WKWebview上的backForwardList
。
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];
将这些URL保存到NSArray
,将允许您将它们保存到nsserdefaults
然后,当您想要“重新创建”webview时,遍历该数组并请求每个url来模拟历史
希望这有帮助 这里没有简单的答案。WKWebView无法存档,也不参与UI状态保存/恢复。你已经发现了这个 对于iOS版Firefox,我们采取了不同的方法来克服这些限制。这远非理想,但确实有效 当我们还原附加了会话信息(以前访问过的页面)的选项卡时,我们从本地web服务器(在本地主机上运行)加载一个特殊的html页面,该页面修改页面的推送状态,并在历史堆栈上推送以前访问过的URL 因为这些URL需要来自同一个来源,所以我们基本上推送URL,就像` 在我们的UI中,我们将其转换为显示
original.url.com
。当用户返回历史以加载这些页面时,我们会截取并加载原始页面,而不是从localhost加载页面
这是一个很大的难题,但这就是我们目前所拥有的一切
参见上的源代码,这并不能完全回答这个问题。您可以解释如何保存然后还原webview。除此之外,这不适用于NSUserDefault,答案是正确的。您通常应该将非plist数据保存到文件中。这是因为没有明显的方法序列化web视图对象。如何在文件中存储视图?序列化是针对数据的。可序列化的结构化数据。不适用于任意用户界面对象。还原webview时,您希望看到什么行为?如果你想让它简单地还原当前和过去的页面URL,那么你可以将它们保存到NSUserDefaults中作为NSStrings。你在这里找到了我,在我找到它之后,它不再是self.view的子视图。我重置了它的属性,例如委派,并将其添加为self的子视图。view,它对我有效,我加载了一个视频并播放了它,但这是在UIWebView上进行的测试。是的,正如您所述,它对UIWebView有效,但WKWebView似乎无法恢复。WKWebView是新事物,苹果公司将在未来使其更好。但是,但是。。。我今天就需要它:(我以前想过,但我认为这对于一个很少发生的事件来说太复杂了。我从来没有打开过浏览器并单击“后退”按钮。谁会这样做?你要么浏览你的最后一页,上一节课的一页,要么转到一个新的页面。“现代”web浏览器的导航系统有缺陷,倾向于使用易于回收的选项卡。@User37190同意。但请记住,操作系统也会在需要时暂停/恢复您的应用程序。因此,它可能不是一个e
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];