为什么我不能将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加载这些,我们拦截,而不是从本地加载页面,我们加载的原始页面。
这是一个很大的黑客,但这是我们在这一点上。
您只能在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来模拟历史。
希望这可以帮助!
- 我怎样才能从AppDelegate TabBarController的ViewController?
- admob interstitial总是返回false
- Alamofire Image:在af_setImageWithURL()之后从AutoPurgingImageCache获取图像
- CoreData返回空对象设置。
- Swift Scenekit – 居中SCNText – getBoundingBoxMin:Max问题
- 什么是Dropbox iOS应用程序相当于“fb://”?
- 如何在代码中以编程方式添加导航控制器,而不是作为初始视图控制器
- iOS:具有-webkit-backface-visibility的多个div:缩放时隐藏崩溃浏览器
- 在IOS中的HTTPS发布请求