Yerel html dosyası UIWebView'e nasıl yüklenir


165

Benim UIWebView bir html dosyası yüklemeye çalışıyorum ama işe yaramaz. İşte sahne: Projemde html_files adlı bir klasör var. Sonra arayüz oluşturucuda bir webView oluşturdum ve ona viewController içinde bir çıkış atadım. Html dosyasını eklemek için kullandığım kod:

-(void)viewDidLoad
{
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html" inDirectory:@"html_files"];
    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];
    [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];
    [super viewDidLoad];
}

Bu işe yaramaz ve UIWebView boştur. Yardıma ihtiyacım var.

Yanıtlar:


272

muhtemelen NSString kullanmak ve html belgesini aşağıdaki gibi yüklemek daha iyidir:

Objective-C

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html"];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[webView loadHTMLString:htmlString baseURL: [[NSBundle mainBundle] bundleURL]];

hızlı

let htmlFile = NSBundle.mainBundle().pathForResource("fileName", ofType: "html")
let html = try? String(contentsOfFile: htmlFile!, encoding: NSUTF8StringEncoding)
webView.loadHTMLString(html!, baseURL: nil) 

Swift 3'te birkaç değişiklik var:

let htmlFile = Bundle.main.path(forResource: "intro", ofType: "html")
let html = try? String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
webView.loadHTMLString(html!, baseURL: nil)

Denedin mi?

Ayrıca kaynağın pathForResource:ofType:inDirectoryçağrı ile bulunduğunu da kontrol edin .


Bu işe yaramadı, NSLog (@ "% @", htmlFile); sadece kontrol etmek ve boş diyor.
madcoderz

Yani bu kaynak bulunamadı. Sadece şunu kontrol edin: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "sample" ofType: @ "html"]; dizinsiz
user478681 15:11

inDirectory olmadan aldım: iPhone Simulator / 4.3.2 / Uygulamalar / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html ama html hala boş görünmüyordu. Başka bir şey mi eksik? Örnek proje: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz

3
sadece web görünümünüzün çerçevesini düzeltmeniz gerekiyor
user478681

3
Bu cevabın çok oyu var ama güncel değil gibi görünüyor. Yerel görüntü ve CSS varlıkları bu yaklaşım kullanılarak yüklenmez. Bunun yerine bu cevaba bakınız .
paulmelnikow

90

EDIT 2016-05-27 - loadRequest"evrensel bir Siteler Arası Komut Dosyası güvenlik açığı" sunar. Yüklediğiniz her bir öğeye sahip olduğunuzdan emin olun. Bozuk bir komut dosyası yüklerseniz, istediği her şeyi yükleyebilir.

Yerel olarak çalışmak için göreli bağlantılara ihtiyacınız varsa, bunu kullanın:

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

Paket, bulmak için projenin tüm alt dizinlerini arar my.html. (dizin yapısı derleme sırasında düzleşir)

my.htmlEtiketi varsa , <img src="some.png">webView some.pngprojenizden yüklenir .


4
Bu sayfada kabul edilen cevabı işe yarayamadım - ancak bu yaklaşım ilk kez çalıştı. Bence orijinal yanıttan bu yana iOS ilerledi. Teşekkürler.
James

Bu cevap için teşekkürler. Bu konuda farklı olan ve kabul edilen cevap HTML dokümanı çalışmasındaki bağlantılardır.
Amy

2
Apple'a göre Güvenlik saldırılarına karşı savunmasız kalmanıza engel olmak için loadHTMLString: baseURL: yerel HTML dosyalarını yüklemek için kullandığınızdan emin olun; loadRequest: kullanmayın.
ED-209

Kabul edilen cevap benim için çalışmıyor. Teşekkürler @neal Ehardt bu cevap benim için çalışıyor.
Mihir Oza

Html dosyası herhangi bir klasör içinde değilse bu benim için işe yarar
Renan Franca

40

bu şekilde proje Varlıklarınızdaki (paket) html dosyasını webView'e yükleyebilirsiniz.

 UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
    [web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];

bu sizin için yararlı olabilir.


Bu tek farkı yaptığım aynı programla webView oluşturuyor olmasıdır. Ama yine de teşekkürler
madcoderz

u NSLog tarafından bu html dosya denetimi yolunu olsun.
AJPatel

Html dosyasının hedef üyeliği kontrol edilmelidir, aksi takdirde şu istisna atılır: -Uzun olmayan 'NSInvalidArgumentException' istisnası nedeniyle uygulama sonlandırılıyor, nedeni: '*** - [NSURL initFileURLWithPath: isDirectory:]: nil string parametresi'
Durai Amuthan. H

9

Sanırım ilkini allocatebaşlatmanız ve başlatmanız gerekiyor webview::

- (void)viewDidLoad
{
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html" inDirectory:@"html_files"];
    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];
    webView = [[UIWebView alloc] init];
    [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];

    [super viewDidLoad];
}

8

Basit Kopyala-Yapıştır kod snippet'i:

-(void)LoadLocalHtmlFile:(NSString *)fileName onWebVu:(UIWebView*)webVu
{
    [webVu loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:fileName ofType:@"html"]isDirectory:NO]]];
}

Not:

Html dosyasının Hedef üyeliğinin işaretlendiğinden emin olun, aksi takdirde aşağıdaki istisna atılır: -

resim açıklamasını buraya girin

Yakalanmayan istisna nedeniyle uygulamayı sonlandırma

'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:isDirectory:]: nil string parameter'


6

Swift 3 ve Swift 4 için:

let htmlFile = Bundle.main.path(forResource: "name_resource", ofType: "html")
let html = try! String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
self.webView.loadHTMLString(html, baseURL: nil)

Bu <img src = "..." /> gibi bağlantılı dosyaları yüklemez
Pierre F

5
UIWebView *web=[[UIWebView alloc]initWithFrame:self.view.frame];
    //[self.view addSubview:web];
    NSString *filePath=[[NSBundle mainBundle]pathForResource:@"browser_demo" ofType:@"html" inDirectory:nil];
    [web loadRequest:[NSURLRequest requestWhttp://stackoverflow.com/review/first-postsithURL:[NSURL fileURLWithPath:filePath]]];

4

HTML dosyanız UTF-8 kodlamasını desteklemiyor olabilir, çünkü aynı kod benim için çalışıyor.

Veya u bu kod satırını da yapabilirsiniz:

NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"Notes For Apple" ofType:@"htm" inDirectory:nil];
NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
[WebView loadHTMLString:htmlString baseURL:nil];

4

İşte Jquery ile HTML dosyasının çalışma yolu.

 _webview=[[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];
    [self.view addSubview:_webview];

    NSString *filePath=[[NSBundle mainBundle]pathForResource:@"jquery" ofType:@"html" inDirectory:nil];

    NSLog(@"%@",filePath);
    NSString *htmlstring=[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

    [_webview loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
                         or
    [_webview loadHTMLString:htmlstring baseURL:nil];

UIWebview'inizdeki HTML dosyasını aramak için istekleri kullanabilirsiniz


3

"Html_files" dosyasının yalnızca Xcode'daki bir grup değil, uygulamanızın ana paketindeki bir dizin olduğundan emin olun.


3

Hızlı kullanarak bunu yapmanın yeni bir yolu. UIWebView artık yok ve WKWebView, web sayfalarını yüklemek için Safari'nin web görünümüne sahip olmasını sağlayan yeni bir sınıf.

    import WebKit

    let preferences = WKPreferences()
    preferences.javaScriptCanOpenWindowsAutomatically = false

    let configuration = WKWebViewConfiguration()
    configuration.preferences = preferences

    let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
    let request = NSURLRequest(URL: NSURL(string: "http://nshipster.com"))
    webView.loadRequest(request)

3
Swift iOS:

 // get server url from the plist directory
        var htmlFile = NSBundle.mainBundle().pathForResource("animation_bg", ofType: "html")!
        var htmlString = NSString(contentsOfFile: htmlFile, encoding: NSUTF8StringEncoding, error: nil)
        self.webView.loadHTMLString(htmlString, baseURL: nil)

3
[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

Geç olabilir ama gelen dosya ise pathForResourceiçine nileklemeniz gerekir Build Phases > Copy Bundle Resources.

resim açıklamasını buraya girin


2

İşte Swift 3:

    if let htmlFile = Bundle.main.path(forResource: "aa", ofType: "html"){
        do{
            let htmlString = try NSString(contentsOfFile: htmlFile, encoding:String.Encoding.utf8.rawValue )
            messageWebView.loadHTMLString(htmlString as String, baseURL: nil)
        }
        catch _ {
        }
    }

1
if let htmlFile = NSBundle.mainBundle().pathForResource("aa", ofType: "html"){
    do{
        let htmlString = try NSString(contentsOfFile: htmlFile, encoding:NSUTF8StringEncoding )
        webView.loadHTMLString(htmlString as String, baseURL: nil)
    }
    catch _ {
    }
}

0

Swift 2.0'da, @ user478681'in yanıtı şöyle görünebilir:

    let HTMLDocumentPath = NSBundle.mainBundle().pathForResource("index", ofType: "html")
    let HTMLString: NSString?

    do {
        HTMLString = try NSString(contentsOfFile: HTMLDocumentPath!, encoding: NSUTF8StringEncoding)
    } catch {
        HTMLString = nil
    }

    myWebView.loadHTMLString(HTMLString as! String, baseURL: nil)

kullanmak daha iyi yol / hata dosyasında hataya karşı test edelim:
ingconti

0

Tüm dosyaları (html ve kaynaklar) bir dizine koy (benim "el kitabım" için). Ardından, dizini "Destek Dosyaları" üzerinde XCode'a sürükleyip bırakın. "Gerekirse Öğeleri Kopyala" ve "Klasör referansları oluştur" seçeneklerini işaretlemelisiniz. Ardından, basit bir kod yazın:

NSURL *url = [[NSBundle mainBundle] URLForResource:@"manual/index" withExtension:@"html"];
[myWebView loadRequest:[NSURLRequest requestWithURL:url]];

Dikkat @"manual/index", manuel dizinimin adıdır !! Hepsi !!!! Kötü ingilizcem için özür dilerim ...

================================================== =====================

Hola desde Kosta Rika. Ponga los archivos (html y demás recursos) en un directorio (en mi caso lo llamé el kitabı), luego, arrastre y suelte en XCode, sobre "Destek Dosyaları". Usted debe seleccionar las opciones "Gerekirse Öğeleri Kopyala" y "Klasör referansları oluştur".

NSURL *url = [[NSBundle mainBundle] URLForResource:@"manual/index" withExtension:@"html"];
[myWebView loadRequest:[NSURLRequest requestWithURL:url]];

Presta atención a @"manual/index", manuel es el nombre de mi directorio !!


0

Projeniz büyüdüğünde, HTML sayfanızın alt klasörlerde bulunan dosyalara başvurabilmesi için bir yapıya ihtiyacınız olabilir.

html_filesKlasörünüzü Xcode'a sürükleyip Klasör referansları oluştur seçeneğini belirlediğinizi varsayarsak , aşağıdaki Swift kodu, WKWebViewdesteklerin sonuçta elde edilen klasör yapısını da desteklemesini sağlar :

import WebKit

@IBOutlet weak var webView: WKWebView!

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

Bu araçlar bu senin eğer sample.htmldosyası bir içeriyor <img src="subfolder/myimage.jpg">etiketi, ardından resim dosyasını myimage.jpgiçinde subfolderde yüklenecek ve görüntülenecektir.

Kredi: https://stackoverflow.com/a/8436281/4769344

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.