Загружать ресурсы из относительного пути, используя локальный html в uiwebview
У меня очень простое приложение iOS с загрузкой uiwebview очень простой тестовой страницы (test.html):
<html>
<body>
<img src="img/myimage.png" />
</body>
</html>
Я загружаю этот файл test.html в свой веб-просмотр:
NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"];
NSString *html = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSURL *baseUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
[webView loadHTMLString:html baseURL:baseUrl];
Это работает отлично, если я ссылаюсь на изображение без относительного пути и помещаю связанное изображение в корневой путь в разделе Цели → Скопировать ресурсы Bundle в XCode, однако я не могу заставить его работать с относительным путем, как показано в мой html файл. Должен быть способ сделать это, у меня много изображений, css, javascript файлов, которые я хочу загрузить в webview, и я бы не хотел, чтобы все было в корне и мне пришлось менять все ссылки в моей сети приложение.
Ответы
Ответ 1
Вот как загрузить/использовать локальный html с относительными ссылками.
- Перетащите ресурс в проект xcode (я перетащил папку с именем www из окна Finder), вы получите две опции: "создать группы для любых добавленных папок" и "создать ссылки на папки для любых добавленных папок".
- Выберите опцию "create folder references..".
-
Используйте приведенный ниже код. Он должен работать как шарм.
NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
[webview loadRequest:[NSURLRequest requestWithURL:url]];
Теперь все ваши относительные ссылки (например, img/.gif, js/.js) в html должны быть решены.
Swift 3
if let path = Bundle.main.path(forResource: "dados", ofType: "html", inDirectory: "root") {
webView.load( URLRequest(url: URL(fileURLWithPath: path)) )
}
Ответ 2
В Swift:
func pathForResource (имя: String?, ofType ext: String?, inDirectory subpath: String?) → String?
- имя: Название Hmtl; - расширение ofType ext: для типа файла. В этом случае "html",
- в подкаталоге inDirectory: папка, где находится файл. В этом случае файл находится в корневой папке;
let path = NSBundle.mainBundle().pathForResource("dados", ofType: "html", inDirectory: "root")
var requestURL = NSURL(string:path!);
var request = NSURLRequest(URL:requestURL);
webView.loadRequest(request)
Ответ 3
Я перепутал все в одну строку (плохо знаю) и не имел никаких проблем с этим:
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test"
ofType:@"html"]
isDirectory:NO]]];
Ответ 4
Я просто делаю это:
UIWebView *webView = [[[UIWebView alloc] init] autorelease];
NSURL *url = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];
Где "index.html" относительно ссылается на изображения, CSS, javascript и т.д.
Ответ 5
Быстрый ответ 2.
Ссылка на класс UIWebView советует не использовать webView.loadRequest(запрос):
Не используйте этот метод для загрузки локальных файлов HTML; вместо этого используйте loadHTMLString: BaseUrl:.
В этом решении html считывается в строку. URL-адрес html используется для определения пути и передает его в качестве базового URL-адреса.
let url = bundle.URLForResource("index", withExtension: "html", subdirectory: "htmlFileFolder")
let html = try String(contentsOfURL: url)
let base = url.URLByDeletingLastPathComponent
webView.loadHTMLString(html, baseURL: base)
Ответ 6
Я вернулся и протестировал и повторно протестировал это, кажется, что единственный способ заставить его работать (поскольку у меня есть некоторые файлы в папке img, а некоторые в js/css и т.д.) не использовать относительный путь к моему изображению в html и иметь все, что связано с папкой пакета. Какой позор: (.
<img src="myimage.png" />
Ответ 7
@sdbrain ответ в Swift 3:
let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")!)
webView.loadRequest(NSURLRequest.init(url: url) as URLRequest)
Ответ 8
В Swift 3.01 с использованием WKWebView:
let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "CWP")!)
myWebView.load(NSURLRequest.init(url: localURL) as URLRequest)
Этот параметр корректирует некоторые более тонкие изменения синтаксиса в 3.01 и сохраняет структуру каталогов на месте, поэтому вы можете вставлять связанные файлы HTML.