UIWebView显示本地存储的网站(HTML,图像,Javascript)

Dev*_*Dev 5 iphone objective-c uiwebview

我一直在寻找这个,找不到任何东西.出于一些有趣的原因,我基本上需要将整个网站存储在我的i​​Phone中.无论我怎么弄清楚如何在我的UIWebView中正确显示它.

编辑:我应该澄清,我可以加载原始的HTML文件,并且我已经将所有路径都归为本地,除了没有任何内容链接.

这是代码

self.dataDetectorTypes = UIDataDetectorTypeLink;
NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSURL *url = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self loadRequest:request];
Run Code Online (Sandbox Code Playgroud)

index.html有一堆 <script type="text/javascript" src="somescript.js">

没有任何JS代码被执行

Ram*_*min 13

看起来您正在从包中加载HTML.这意味着所有其他文件(.js,.css和任何媒体文件)也需要出现在您的包中.所以要检查的第一件事是查看可执行文件的内容并确保包含js等文件.

如果看起来很好,接下来要检查的是html,js或css文件是通过相对URL还是绝对URL引用内容.如果Web内容中存在绝对路径引用,则UIWebView将尝试每次都下载该内容,因此只有在您具有网络连接时它才会起作用.如果路径是相对的,那么它将查看捆绑包以查看是否存在这样的文件.

当您将html和内容包含到XCode项目文件中时,您可能会将文件拖到项目侧栏,并询问是否"为任何添加的文件夹递归创建组"或"为任何添加的文件创建文件夹参考"文件夹".

默认值是第一个,这意味着XCode在项目中创建一个黄色文件夹,但是当生成输出包时,它将忽略磁盘上的目录层次结构.如果选择第二个选项,则文件夹为蓝色,如果查看输出包,则会看到整个文件夹层次结构已被复制.

第一个适用于简单的网页,其中所有内容都在同一文件夹级别,您可以使用上面列出的方法加载它.如果您的网页很复杂并且引用子文件夹中的内容,则第二种情况会更好用,在这种情况下您需要从相对路径(例如,'webpages'文件夹)加载网页:

NSString *path = [[NSBundle mainBundle] 
                 pathForResource:@"index" ofType:@"html" 
                     inDirectory:@"webpages"];
Run Code Online (Sandbox Code Playgroud)

要检查的最后一件事是html文件中是否有任何BASE标记.这是一种为页面上的所有链接指定默认地址或目标的方法,但它可以删除webview链接.


Dad*_*Dad 7

问题是这个电话:

NSURL *url = [NSURL fileURLWithPath:path];
Run Code Online (Sandbox Code Playgroud)

没有设置baseURL,所以.html文件中的相对路径,如javascript,css,图像等不起作用.

而是使用这个:

url = [NSURL URLWithString: [path lastPathComponent] 
             relativeToURL: [NSURL fileURLWithPath: [path stringByDeletingLastPathComponent] 
                                       isDirectory: YES]];
Run Code Online (Sandbox Code Playgroud)

然后将找到index.html文件中的"styles.css"之类的内容,将它们复制到.html文件旁边的包中.