Завантажте ресурси з відносного шляху, використовуючи локальний html в uiwebview


121

У мене дуже простий додаток для 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];

Це прекрасно працює, якщо я посилаюсь на зображення без відносного шляху і поміщаю посилане зображення в кореневий шлях під цілью -> Скопіюйте ресурси ресурсу в XCode, однак я не можу змусити його працювати з відносним шляхом, як показано в моєму HTML-файлі . Повинен бути спосіб це зробити, у мене є маса зображень, CSS, файлів javascript, які я хочу завантажити у веб-перегляд, і мені хотілося б не мати все в корені, а потрібно змінювати всі посилання в моєму веб додаток

Відповіді:


286

Ось як завантажувати / використовувати локальний html із відносними посиланнями.

  1. Перетягніть ресурс у проект xcode (я перетягнув папку з іменем www у вікно пошуку), ви отримаєте два варіанти "створити групи для будь-яких доданих папок" та "створити посилання на папки для будь-яких доданих папок".
  2. Виберіть опцію "створити посилання на папки ..".
  3. Скористайтеся наведеним нижче кодом. Це повинно працювати як шарм.

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
    [webview loadRequest:[NSURLRequest requestWithURL:url]];

Тепер усі ваші відносні посилання (наприклад, img / .gif, js / .js) у html мають бути вирішені.

Швидкий 3

    if let path = Bundle.main.path(forResource: "dados", ofType: "html", inDirectory: "root") {
        webView.load( URLRequest(url: URL(fileURLWithPath: path)) )
    }

1
Супер і вгору проголосували! Чи може хтось пояснити, чому "створювати посилання на папки, як протиставити" створювати групи для будь-яких доданих папок "?
Шон

3
Як Зауваження, якщо ви намагаєтеся завантажити JavaScript - файли , на відміну від зображень, ви повинні дивитися на це так: stackoverflow.com/a/3629479/385619
Willster

2
Що робити , якщо каталог п папки глибоко? Чи добре передавати рядок, як @"www/app"для аргументу каталогу?
промінь

1
Що робити, якщо ми завантажуємо html з Документів, а не з групи?
chipbk10

@Sean XCode за замовчуванням зберігає всі файли, додані в кореневу папку, групи призначені лише для того, щоб дерево вашого проекту виглядало добре. Посилання на папки насправді копіюють вміст як є, зберігаючи структуру каталогу. Це дуже важливо, якщо ви хочете, щоб ваші відносні шляхи працювали на пристрої так само, як це стосується вашої офісної машини.
Combuster

24

У Свіфті:

 func pathForResource(  name: String?, 
                        ofType ext: String?, 
                        inDirectory subpath: String?) -> String?  {

  // **name:** Name of Hmtl
  // **ofType ext:** extension for type of file. In this case "html"
  // **inDirectory subpath:** the folder where are the file. 
  //    In this case the file is in root folder

    let path = NSBundle.mainBundle().pathForResource(             "dados",
                                                     ofType:      "html", 
                                                     inDirectory: "root")
    var requestURL = NSURL(string:path!)
    var request = NSURLRequest(URL:requestURL)

    webView.loadRequest(request)
}

Дякуємо за код Свіфта. Добре працював разом із прийнятим відповіддю
Бала Вішну

Ласкаво просимо! :.) @Bala Vishnu
Weles

Працює чудово, мені довелося розмотати requestURL.
RRikesh

5

Я забила все в один рядок (погано знаю) і не мала проблем із цим:

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" 
                                                                                                         ofType:@"html"]
                                                             isDirectory:NO]]];         

1
Чи використовуєте ви у проекті XCode для свого зображення під цільовим вузлом "Відносно проекту" чи "Відносно групи, що охоплює"? Я використовував відносний проект, оскільки в діалоговому вікні отримання інформації шлях, який він показує, коли я вибираю відносно проекту, виглядає правильним. Однак, здається, правильно завантажувати зображення, коли я вибираю відносно групи, що вкладається. Тепер я просто завітаю, щоб моя повна сторінка правильно працювала з javascript та css і все, дякую!
Метт Палмерлі

Тьфу! Цей uiwebview настільки крихкий, я почав повільно додавати більш складні тести на свою тестову сторінку (тобто встановити зображення за допомогою css замість inline в тезі img), і він не працював, тому я повернувся до того, що у мене був спочатку, і він не став Я знову не працюю! Можливо, я маю справу з якимось кешуванням у своєму uiwebview?
Метт Палмерлі

5

Я просто роблю це:

    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 тощо.


2

Швидка відповідь 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)

Якщо це так, було б добре посилатися на те, де в посібнику він радить це, і вставити уривок із цієї сторінки - це наразі дуже без контексту.
Бен Кокс

Коментар Apple знаходиться на сторінці методу Instance для loadRequest:
Джефф

0

Я повернувся назад і тестував і повторно перевіряв це, виявляється, що єдиний спосіб, коли я можу змусити його працювати (оскільки у мене є деякі файли в папці img, а деякі в js / css тощо), - це не використовувати відносний шлях до мого зображення в HTML і мати все посилання на папку пакета. Який сором :(.

<img src="myimage.png" />

0

@ відповідь 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)

-1

У 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-файли.


Чи не випав префікс NS для основних типів основи починаючи з 3.x? Це зробив для мене хитрість, дякую! let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "mapa_procesos")!) webView.loadRequest(URLRequest(url: localURL))
Едуардо Гомес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.