在UIWebView中加载包含SVG的HTML5,同时保持localStorage可用

时间:2011-02-16 16:38:33

标签: iphone objective-c svg local-storage

我正在开发一个使用UIWebView来显示基于HTML5的页面的iphone应用程序。要求包括:

1:页面需要渲染内联SVG 2:页面需要访问localStorage。

要使mime类型正确以使内联SVG正常工作,我首先尝试使用以下代码填充Web视图:

NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; 
NSURL *baseURL = [[NSURL alloc] initFileURLWithPath:resourcePath];
[self.webView loadData:htmlData 
 MIMEType:@"application/xhtml+xml"  
 textEncodingName:@"UTF-8" 
 baseURL:baseURL];

但是,在尝试此技术时,我在尝试访问本地存储时仍然会出现SECURITY_ERR异常: W3C documentation on localStorage and SECURITY_ERR

我找到了有同样问题的人,他们认为这是由于域名来源: Post covering issues with UIWebView and localStorage access issues

他们通过使用NSURLRequest来解决他们的问题:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:[path stringByAppendingString:@"path and file name of the file"]];
NSURLRequest *request = [NSURLRequest requestWithURL:baseURL];
[webView loadRequest:request];

这似乎解决了我的localStorage问题,但是这会破坏我的SVG,因为在这种情况下我不知道如何显式设置mime类型。

所以,问题是,如何使用正确的mime类型为内联svg加载数据,同时仍保持文档的原始符合localStorage要求?

感谢您的帮助:)

3 个答案:

答案 0 :(得分:1)

您是否尝试过创建NSMutableURLRequest并将mime类型添加为HTTP标头字段?

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:baseURL];
[request addValue:@"application/xhtml+xml" forHTTPHeaderField:@"Content-Type"];

维基百科上的list of header fields表示这仅用于放置和发布请求,但可能值得一试。

答案 1 :(得分:0)

我正在使用它直接加载我的.svg文件:

    CGRect webFrame;
    webFrame = CGRectMake(0.0, 0.0, 480, 320);
    UIWebView *webView;
    webView = [[UIWebView alloc] initWithFrame:webFrame];
    [[self view] addSubview:webView]; 
    webView.delegate = self;
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout = 'none'"];
    NSString* urlAddress = [[NSBundle mainBundle] pathForResource:@"mappaSVG" ofType:@"svg"];
    NSURL* url = [NSURL fileURLWithPath: urlAddress];
    NSURLRequest* requestObj = [NSURLRequest requestWithURL: url];
    [[self webView] loadRequest: requestObj];
    webView.scalesPageToFit = YES;
    [super viewDidLoad];

这一切都没问题,但有时候我用这个来加载一个调用/加载外部.svg文件的.html文件:

NSString* urlAddress = [[NSBundle mainBundle] pathForResource:@"fileWithAMap" ofType:@"html";

其中fileWithAMap.html的内容为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta content="yes" name="apple-mobile-web-app-capable" />
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
    <meta name='viewport' content='initial-scale=1.4; maximum-scale=9.0; minimum-scale=0.07; user-scalable=1;' />
    <title>My Title</title>
</head>

<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<div id="content">
    <embed src="mappaSVG.svg" width="3840" height="3200" type="image/svg+xml" />
</div>
</body>
</html>

它也可以正常工作

答案 2 :(得分:0)

我今天感到振作起来,很大程度上要归功于@JimDusseau提供了解决问题的新尝试(我必须承认我已经放弃了让它发挥作用。)不幸的是,Jim的方法适用于请求,但它仍然对回应没有影响。

然后我用谷歌搜索了2个小时试图找到其他选项,其中一个尝试将mime类型与特定文件扩展名相关联等。

所有这些谷歌搜索都没有结果,但确实触发了对另一个文件扩展名的模糊记忆......

<强> .xhtml

使用此文件扩展名是否会导致使用适当的mime类型处理请求?我的心脏开始跳动,我能感觉到血液在我的血管中流淌,并且非常期待,我做了编辑并重建了项目以找到[鼓声] ...

YES!是!是! iphone使用适当的mime类型处理响应并保持文档原点对localStorage感到满意。

这是工作代码:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"xhtml"];
NSURL *baseURL = [NSURL fileURLWithPath:filePath];
NSURLRequest *request = [NSURLRequest requestWithURL:baseURL];
[webView loadRequest:request];

简单但难以捉摸(直到现在。)