Uiwebview'da yerel html kullanarak kaynakları göreceli yoldan yükleyin


121

Çok basit bir test sayfası (test.html) yükleyen bir uiwebview ile çok basit bir iOS uygulamam var:

<html>
<body>
<img src="img/myimage.png" />
</body>
</html>

Bu test.html dosyasını web görünümüme yüklüyorum:

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];

Bu, göreli yol olmadan görüntüye başvurursam ve referans alınan görüntüyü kök yoluna XCode içindeki Hedefler -> Paket Kaynaklarını Kopyala altında koyarsam iyi çalışır, ancak html dosyamda gösterildiği gibi göreli yolla çalışmasını sağlayamıyorum . Bunu yapmanın bir yolu olmalı, web görünümüne yüklemek istediğim çok sayıda resim, css, javascript dosyam var ve her şeyin kökte olmasını istemiyorum ve web'imdeki tüm referansları değiştirmek zorunda kalmam Uygulamanın.

Yanıtlar:


286

Göreceli referanslarla yerel bir html'nin nasıl yükleneceği / kullanılacağı budur.

  1. Kaynağı xcode projenize sürükleyin (bulucu penceremden www adlı bir klasörü sürükledim), "eklenen klasörler için gruplar oluştur" ve "eklenen klasörler için klasör referansları oluştur" şeklinde iki seçenek göreceksiniz.
  2. "Klasör referansları oluştur .." seçeneğini seçin.
  3. Aşağıda verilen kodu kullanın. Bir cazibe gibi çalışmalı.

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

Şimdi html'deki tüm göreceli bağlantılarınız (img / .gif, js / .js gibi) çözülmelidir.

Hızlı 3

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

1
Süper ve Yukarı oy verdi! "Eklenen klasörler için gruplar oluşturmanın" aksine "klasör referansları oluşturmanın" nedenini açıklayan var mı?
Sean

3
Bir yan not olarak, javascript dosyalarını görsellerin aksine yüklemeye çalışıyorsanız, buna da bakmanız gerekir: stackoverflow.com/a/3629479/385619
Willster

2
Ya dizin n klasör derinse? @"www/app"Arg dizini gibi bir dizge geçmek doğru mudur ?
ray

1
Ya html'yi Bundle'dan değil Belgelerden yüklersek?
chipbk10

@Sean XCode varsayılan olarak kök klasöre eklenen tüm dosyaları depolar, gruplar yalnızca proje ağacınızın iyi görünmesini sağlamak içindir. Klasör referansları, dizin yapısını koruyarak içeriği olduğu gibi kopyalar. İlgili yollarınızın aygıtta ofis makinenizde olduğu gibi çalışmasını istiyorsanız, bu oldukça önemlidir.
yakıcı

24

Swift'de:

 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)
}

Swift kodu için teşekkürler. Kabul Edilen Cevap ile birlikte iyi çalıştı
Bala Vishnu

Hoşgeldiniz! @Bala Vishnu
Weles

Harika çalışıyor, requestURLyine de açmak zorunda kaldım .
RRikesh

5

Her şeyi tek bir satıra sığdırdım (biliyorum kötü) ve hiçbir sıkıntım yoktu:

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

1
Hedef düğüm altındaki görüntünüzün XCode projesinde, "Projeye göre" mi yoksa "Kapsayan Gruba Göre" mi kullanıyorsunuz? Projeye göre özelliğini kullanıyordum çünkü bilgi edin iletişim kutusunda Projeye göre'yi seçtiğimde gösterdiği yol doğru görünüyor. Ancak, çevreleyen gruba göre seçtiğimde görüntüyü doğru yüklüyor gibi görünüyor. Şimdi javascript ve css ile doğru şekilde çalışmak için tam sayfamı almaya gidiyorum ve hepsi teşekkürler!
Matt Palmerlee

Ihh! Bu uiwebview o kadar kırılgan ki, test sayfama yavaşça daha karmaşık testler eklemeye başladım (yani resmi img etiketinde satır içi yerine css ile ayarlamak) ve çalışmıyordu, bu yüzden başlangıçta sahip olduğum şeye geri döndüm ve olmadı Tekrar çalışmayın! Belki uiweb görünümümde bir tür önbelleğe alma ile uğraşıyorum?
Matt Palmerlee

5

Bunu basitçe yapıyorum:

    UIWebView *webView = [[[UIWebView alloc] init] autorelease];

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];

"İndex.html" resimlere, CSS'ye, javascript'e vb. Göreceli olarak atıfta bulunurken.


2

Hızlı cevap 2.

UIWebView sınıfı başvurusu webView.loadRequest (istek) kullanarak karşı tavsiyede:

Yerel HTML dosyalarını yüklemek için bu yöntemi kullanmayın; bunun yerine loadHTMLString: baseURL: kullanın.

Bu çözümde html bir dizge olarak okunur. Html'nin url'si yolu bulmak için kullanılır ve bunu temel url olarak iletir.

let url = bundle.URLForResource("index", withExtension: "html", subdirectory: "htmlFileFolder")
let html = try String(contentsOfURL: url)
let base = url.URLByDeletingLastPathComponent
webView.loadHTMLString(html, baseURL: base)

Durum buysa, kılavuzun bunu tavsiye ettiği yere bakmak ve o sayfadan bir alıntı eklemek iyi olacaktır - şu anda bağlamsız görünmektedir.
Ben Cox

Apple'ın yorumu, loadRequest için Örnek Yöntemi sayfasındadır:
Jeff

0

Geri dönüp test ettim ve tekrar test ettim, işe yarayabilmemin tek yolunun (img klasöründe bazı dosyalarım ve js / css'de bazı dosyalarım olduğu için, vb.) html'deki resmime göreceli bir yol kullan ve her şeyin paket klasörüne başvurmasını sağla. Ne utanç :(.

<img src="myimage.png" />

0

@ sdbrain'in Swift 3'teki cevabı:

    let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")!)
    webView.loadRequest(NSURLRequest.init(url: url) as URLRequest)

-1

WKWebView kullanarak Swift 3.01'de:

let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "CWP")!)
myWebView.load(NSURLRequest.init(url: localURL) as URLRequest)

Bu, 3.01'deki bazı daha ince sözdizimi değişikliklerini ayarlar ve ilgili HTML dosyalarını gömebilmeniz için dizin yapısını yerinde tutar.


NS öneki, 3.x'ten beri temel temel türleri için çıkarılmadı mı? Bu benim için hile yaptı, teşekkürler! let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "mapa_procesos")!) webView.loadRequest(URLRequest(url: localURL))
Eduardo Gomez
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.