UIWebView में स्थानीय HTML फ़ाइल को कैसे लोड करें


165

मैं अपने UIWebView में एक html फ़ाइल लोड करने की कोशिश कर रहा हूं, लेकिन यह काम नहीं करेगा। यहाँ मंच है: मेरे पास अपने प्रोजेक्ट में html_files नामक एक फ़ोल्डर है। तब मैंने इंटरफ़ेस बिल्डर में एक वेब व्यू बनाया और व्यू कॉन्ट्रोलर में इसे एक आउटलेट सौंपा। यह वह कोड है जिसका उपयोग मैं html फाइल को जोड़ने के लिए कर रहा हूं:

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

यह काम नहीं करेगा और UIWebView रिक्त है। मैं कुछ मदद की सराहना करता हूँ।

जवाबों:


272

शायद NSString का उपयोग करना बेहतर है और HTML दस्तावेज़ को निम्नानुसार लोड करना है:

उद्देश्य सी

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

तीव्र

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

स्विफ्ट 3 में कुछ बदलाव हैं:

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

क्या आप ने कोशिश की?

यह भी जांचें कि संसाधन pathForResource:ofType:inDirectoryकॉल द्वारा पाया गया था ।


यह काम नहीं किया, मैंने NSLog (@ "% @", htmlFile) किया; बस जाँच करने के लिए और यह अशक्त कहते हैं।
madcoderz

तो इसका मतलब है कि संसाधन नहीं मिला। बस के साथ की जाँच करें: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "नमूना" टाइप: @ "html"]; बिना इनडायरेक्ट्री के
user478681

बिना इनडायरेक्ट्री के मुझे मिला: iPhone सिमुलेटर / 4.3.2 / एप्लीकेशन / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.html लेकिन HTML स्क्रीन में नहीं दिखा था कि यह अभी भी खाली है। क्या मुझे कुछ और याद आ रहा है? यहाँ नमूना परियोजना है: http://www.box.net/sared/rb05b4ppjnbof1r33gh7
madcoderz

3
आपको बस अपने वेबव्यू के फ्रेम को ठीक करने की आवश्यकता है
user478681

3
इस जवाब में बहुत सारे वोट हैं लेकिन यह पुराना है। इस दृष्टिकोण का उपयोग करके स्थानीय छवि और CSS संपत्तियां लोड नहीं होंगी। इसके बजाय इसका जवाब देखें ।
पौलमेलनिकोव

90

EDIT 2016-05-27 - loadRequest"एक सार्वभौमिक क्रॉस-साइट स्क्रिप्टिंग भेद्यता को उजागर करता है।" सुनिश्चित करें कि आप अपने द्वारा लोड की गई हर एक संपत्ति के स्वामी हैं। यदि आप एक खराब स्क्रिप्ट लोड करते हैं, तो यह कुछ भी लोड कर सकता है जो वह चाहता है।

यदि आपको स्थानीय स्तर पर काम करने के लिए सापेक्ष लिंक की आवश्यकता है, तो इसका उपयोग करें:

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

बंडल खोजने के लिए प्रोजेक्ट के सभी उपनिर्देशिकाओं को खोजेगा my.html। (निर्माण समय में निर्देशिका संरचना समतल हो जाती है)

यदि आपके my.htmlपास टैग है <img src="some.png">, तो webView some.pngआपके प्रोजेक्ट से लोड हो जाएगा ।


4
मुझे इस पृष्ठ पर काम करने के लिए स्वीकृत उत्तर नहीं मिला - लेकिन इस दृष्टिकोण ने पहली बार काम किया। मुझे लगता है कि मूल जवाब के बाद से iOS चालू हो गया है। धन्यवाद।
जेम्स

इस उत्तर के लिए धन्यवाद। इस बारे में अलग क्या है बनाम स्वीकृत उत्तर HTML डॉक कार्य में लिंक है।
एमी

2
Apple के अनुसार , सुरक्षा हमलों की चपेट में आने से बचने के लिए, लोड HTMLString का उपयोग करना सुनिश्चित करें: आधार: स्थानीय HTML फ़ाइलों को लोड करने के लिए; LoadRequest का उपयोग न करें:।
ईडी -209

स्वीकृत उत्तर मेरे लिए काम नहीं कर रहा है। धन्यवाद @neal Ehardt यह उत्तर मेरे लिए काम कर रहा है।
मिहिर ओझा

यह केवल मेरे लिए काम करता है अगर html फ़ाइल किसी भी फ़ोल्डर के अंदर नहीं है
रेनन फ्रेंका

40

इसके द्वारा आप html फ़ाइल को लोड कर सकते हैं जो कि आपके प्रोजेक्ट एसेट्स (बंडल) में webView है।

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

यह आपके लिए उपयोगी हो सकता है।


मैं वही कर रहा हूँ फर्क सिर्फ इतना है कि आप webView प्रोग्रामेटिक रूप से बना रहे हैं। लेकिन वैसे भी धन्यवाद
madcoderz

आप NSLog द्वारा उस html फ़ाइल जाँच का पथ प्राप्त करें।
AJPatel

Html फ़ाइल की लक्ष्य सदस्यता की जाँच की जानी चाहिए अन्यथा निम्न अपवाद को फेंक दिया जाएगा: -विशेष अपवाद 'NSInvalidArgumentException' अपवाद के कारण -टर्मिंग ऐप, कारण: '*** - [NSURL initFileURLINithPath: isDirectory:]: nil string पैरामीटर'
Durai Amuthan। H

9

मुझे लगता है कि आपको allocateअपनी 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

एक साधारण कॉपी-पेस्ट कोड स्निपेट:

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

ध्यान दें:

सुनिश्चित करें कि html फ़ाइल की लक्ष्य सदस्यता की जाँच की गई है अन्यथा निम्नलिखित अपवाद को फेंक दिया जाएगा: -

यहां छवि विवरण दर्ज करें

अनियोजित अपवाद के कारण समाप्ति एप्लिकेशन

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


6

स्विफ्ट 3 और स्विफ्ट 4 के लिए:

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)

यह लिंक की गई फ़ाइलों को लोड नहीं करेगा जैसे <img src = "..." />
पियरे एफ

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 फ़ाइल UTF-8 एन्कोडिंग का समर्थन न करे, क्योंकि वही कोड मेरे लिए काम कर रहा है।

या यू कोड की ये लाइन भी दे सकते हैं:

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

यहाँ जिस तरह से Jquery के साथ HTML फ़ाइल का काम कर रहा है।

 _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 में HTML फ़ाइल को कॉल करने के लिए अनुरोधों का उपयोग कर सकते हैं


3

सुनिश्चित करें कि "html_files" आपके ऐप के मुख्य बंडल में एक निर्देशिका है, और केवल Xcode में एक समूह नहीं है।


3

स्विफ्ट का उपयोग करके ऐसा करने का एक नया तरीका। UIWebView नहीं है और WKWebView वेब पेज लोड करने के लिए नई कक्षा है, जो वेब दृश्य के लिए सफारी सुविधाओं को सुनिश्चित करता है।

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

यह देर से हो सकता है, लेकिन अगर से फ़ाइल pathForResourceहै nilआप में यह जोड़ना चाहिए Build Phases > Copy Bundle Resources

यहां छवि विवरण दर्ज करें


2

यहां स्विफ्ट 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

स्विफ्ट 2.0 में, @ user478681 का जवाब इस तरह दिख सकता है:

    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)

पथ / कोई फ़ाइल में त्रुटि के खिलाफ परीक्षण करने के लिए उपयोग करने के लिए बेहतर:
ingconti

0

सभी फाइलें (html और संसाधन) एक निर्देशिका में (मेरे "मैनुअल" के लिए) रखो। अगला, "सपोर्टिंग फाइल्स" पर, निर्देशिका को XCode पर खींचें और छोड़ें। आपको "यदि आवश्यक हो तो आइटम कॉपी करें" और "फ़ोल्डर संदर्भ बनाएं" विकल्पों की जांच करनी चाहिए। अगला, एक सरल कोड लिखें:

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

ध्यान @"manual/index", मैनुअल मेरी निर्देशिका का नाम है !! यह सब है !!!! मेरी खराब इंग्लिश के लिए माफ़ कीजिये...

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

होला डेसडे कोस्टा रिका। पोंगा लॉस आर्चीवोस (html y demás recursos) en un directorio (en mi caso lo llamé मैन्युअल), luego, arrastre y suelte en XCode, sobre "सपोर्टिंग फाइल्स"। Usted debe seleccionar las opciones "कॉपी आइटम यदि आवश्यक हो तो" y "फ़ोल्डर संदर्भ बनाएं"।

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

प्रेस्टा एटेंसियोन ए @"manual/index", मैनुअल एस एल नम्ब्रे डे मील डायरेक्टरियो !!


0

जब आपकी परियोजना बड़ी हो जाती है, तो आपको कुछ संरचना की आवश्यकता हो सकती है, ताकि आपका HTML पृष्ठ सबफ़ोल्डर में स्थित फ़ाइलों को संदर्भित कर सके।

मान लें कि आप अपने html_filesफ़ोल्डर को Xcode में खींचें और फ़ोल्डर संदर्भ बनाएँ विकल्प चुनें, निम्नलिखित स्विफ्ट कोड सुनिश्चित करता है कि WKWebViewसमर्थन भी परिणामी फ़ोल्डर फ़ोल्डर:

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

इसका मतलब है कि आपके अगर sample.htmlफ़ाइल एक होता है <img src="subfolder/myimage.jpg">टैग, तो छवि फ़ाइल myimage.jpgमें subfolderभी भरी हुई और प्रदर्शित किया जाएगा।

क्रेडिट: https://stackoverflow.com/a/8436281/4769344

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.