Загрузка HTML5, содержащего SVG, в UIWebView при сохранении доступности localStorage - PullRequest
1 голос
/ 16 февраля 2011

Я разрабатываю приложение для iphone, которое использует UIWebView для отображения страницы на основе HTML5. Требования включают в себя:

1: страница должна отображать встроенный SVG.
2: странице требуется доступ к localStorage.

Чтобы правильно настроить тип MIME для работы встроенного SVG, я сначала попытался использовать приведенный ниже код для заполнения веб-представления:

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 для localStorage и SECURITY_ERR

Я нашел кого-то, у кого была такая же проблема, и они полагали, что это связано с происхождением домена Пост, освещающий проблемы с доступом к UIWebView и localStorage

Они решили свою проблему, используя вместо этого 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 ]

1 голос
/ 24 февраля 2011

Вы пытались создать NSMutableURLRequest и добавить mime-тип в качестве поля заголовка HTTP?

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

Список полей заголовков в википедии говорит, что это используется только для запросов на размещение и публикацию, но это может стоить попытки.

0 голосов
/ 25 февраля 2011

Сегодня я почувствовал прилив сил, во многом благодаря тому, что @JimDusseau предоставил новую попытку решить проблему (должен признаться, что бросил работать над этим.) К сожалению, подход Джима работает для запроса, но все еще не повлияло на ответ.

Затем я в течение 2 часов гуглял, пытаясь найти другие варианты, один из которых пытался связать тип MIME с определенными расширениями файлов и т. Д.

Все это Googling оказалось бесплодным, но оно вызвало смутную память о другом расширении файла ...

.xhtml

Может ли использование этого расширения файла вызвать обработку запроса с соответствующим типом mime? Мое сердце начало биться, я чувствовал, как кровь течет по моим венам, и, с большим нетерпением, я внес изменения и перестроил проект, чтобы найти этот [барабанная дробь] ...

ДА! ДА! ДА! IPhone обрабатывает ответ с соответствующим типом пантомимы И сохраняет происхождение документа для localStorage.

Вот рабочий код:

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

Простой, но неуловимый (до сих пор.)

0 голосов
/ 21 февраля 2011

Я использую это, чтобы загрузить непосредственно мой файл .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];

, и все это нормально, но иногда я использую это для загрузки файла .html, который вызывает / загружает внешний.SVG-файл:

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>

и тоже отлично работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...