互联网不可用时离线UIWebView

时间:2013-07-16 23:54:49

标签: html ios caching uiwebview segue

我有一个UIWebView。当有互联网访问时,我希望它加载实际网页,当没有互联网时,我希望它加载已保存的html完整网站文件。我用本地文件实现了一个测试webView,它运行得很好。代码是这样的:

[myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"My Website" ofType:@"html"]isDirectory:NO]]];

当然,我合成了webview,并在.h中创建了它。我也做了一个正常的webview在线访问网站,这是完全相同的,除了在viewDidLoad中代替上面的代码,它说:

NSString *fullURL = @"http://www.mywebsite.com";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[myWebView loadRequest:requestObj];

然而,当我尝试使用webview加载html时没有可用的互联网和互联网可用时的网站,它工作,但离线网站停止支持除主页面以外的任何内容并丢失所有照片(它们工作正常在单独的视图中,如上所述,只是不在演示离线在线视图中)。我使用了以下代码:

NSURL *scriptUrl = [NSURL URLWithString:@"http://www.mywebsite.com"];
NSData *data = [NSData dataWithContentsOfURL:scriptUrl];
if (data) {
NSLog(@"Device is connected to the internet");
NSString *fullURL = @"http://www.mywebsite.com";
NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[myWebView loadRequest:requestObj];

} else {
NSLog(@"Device is not connected to the internet");
[myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"My Website" ofType:@"html"]isDirectory:NO]]];
}

无奈之下,我尝试在每个原始视图中添加一个导航栏,这样在离线视图中你可以点击按钮说“" online"并转到在线视图,反之亦然。这失败了:离线视图(这是最初的一个)工作得很好,但当我按下"在线"按钮我收到以下错误:

  

***第一次抛出调用堆栈:(0x321cb3e7 0x3a065963 0x321cb0d5 0x32a397d9 0x32a35543 0x321518a5 0x34176e7d 0x341766ff 0x3406f079   0x33ff9451 0x34085357 0x340c6cd9 0x340c5fab 0x341e7da3 0x340c5087   0x340c5111 0x340c5087 0x340c503b 0x340c5015 0x340c48cb 0x340c4db9   0x33fed5f9 0x33fda8e1 0x33fda1ef 0x35cce5f7 0x35cce227 0x321a03e7   0x321a038b 0x3219f20f 0x3211223d 0x321120c9 0x35ccd33b 0x3402e2b9   0x8194d 0x3a492b20)libc ++ abi.dylib:终止调用throw a   例外

我尝试将在线视图作为初始视图,离线视图是您单击条形按钮进入的次要视图,并且离线视图停止工作。看起来好像初始视图将加载,无论哪个加载,而不是次加载。也许我错误地使用了条形按钮项目,虽然我有经验丰富的故事板,并且在我的项目的其余部分中有许多条形按钮segues。是的,我在实现上次提到的条形按钮解决方案时,确实改变了我的网页视图的名称(myWebView和myOfflineWebView),最初失败后,因为我认为可能有两个不同的uiWebViews具有相同的名称,尽管是不同的viewControllers,可能是问题,但这没有帮助。

感谢任何反馈。可能用于检查互联网可用性的代码不起作用,因为它是为OSX制作的。我发现它here。我宁愿不要使用大型库(例如this之一,这经常被提及)来阻碍我的项目,因为它有许多库已准备好并且有点慢。我不能使用通常的Apple Reachability示例项目,因为我使用的是ARC。我可以重构它,但我没有太多时间,并且更喜欢更简单的解决方案,即使它不是100%完美或优雅。谢谢!

1 个答案:

答案 0 :(得分:1)

因此,关于互联网可用性,您需要使用this reachability library。 此外,您的图片和链接可能未加载,因为您保存的html具有绝对网址:http://foo.com/image.jpg由于您没有连接而无法加载。