我正在开发一个使用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要求?
感谢您的帮助:)
答案 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];
简单但难以捉摸(直到现在。)