Uiwebview में स्थानीय HTML का उपयोग करके सापेक्ष पथ से संसाधन लोड करें


121

मैं एक बहुत ही सरल परीक्षण पृष्ठ (test.html) लोड करने वाले uiwebview के साथ एक बहुत ही सरल iOS ऐप है:

<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 फ़ाइल में दिखाए गए सापेक्ष पथ के साथ काम करने के लिए नहीं प्राप्त कर सकता हूं । ऐसा करने का एक तरीका होना चाहिए, मेरे पास बहुत सारी छवियां, सीएसएस, जावास्क्रिप्ट फाइलें हैं जिन्हें मैं वेबव्यू में लोड करना चाहता हूं और मैं चाहूंगा कि रूट में सब कुछ न हो और मुझे अपने वेब में सभी संदर्भों को बदलना पड़े एप्लिकेशन।

जवाबों:


286

यह एक स्थानीय html को रिश्तेदार संदर्भों के साथ लोड / उपयोग करने का तरीका है।

  1. संसाधन को अपने xcode प्रोजेक्ट में खींचें (मैंने अपने खोजक विंडो से www नाम का एक फ़ोल्डर खींचा), आपको दो विकल्प मिलेंगे "किसी भी जोड़े गए फ़ोल्डर के लिए समूह बनाएं" और "किसी भी जोड़े गए फ़ोल्डर के लिए फ़ोल्डर संदर्भ बनाएं"।
  2. "फ़ोल्डर संदर्भ बनाएँ .." विकल्प चुनें।
  3. नीचे दिए गए कोड का उपयोग करें। यह एक आकर्षण की तरह काम करना चाहिए।

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

अब html में आपके सभी रिश्तेदार लिंक (जैसे img / .gif, js / .js) को हल करना चाहिए।

स्विफ्ट 3

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

1
सुपर और अप मतदान! क्या कोई समझा सकता है कि "किसी भी जोड़े गए फ़ोल्डर के लिए समूह बनाने के विरोध में" फ़ोल्डर संदर्भ क्यों बनाएं?
शॉन

3
एक सिडेनोट के रूप में, यदि आप छवियों के विपरीत जावास्क्रिप्ट फ़ाइलों को लोड करने की कोशिश कर रहे हैं, तो आपको इसे भी देखना होगा: stackoverflow.com/a/3629479/385619
विलस्टर

2
क्या होगा यदि निर्देशिका n फ़ोल्डर गहरी है? क्या @"www/app"निर्देशिका arg के लिए स्ट्रिंग को पास करना ठीक है ?
किरण

1
यदि हम डाक्यूमेंट्स से html लोड करते हैं, तो बंडल से नहीं?
चिपबेक

@ सीन 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 विष्णु
Weles

महान काम करता है, मुझे requestURLहालांकि खोलना नहीं था ।
आरिकेश

5

मैंने सब कुछ एक लाइन में कर दिया (बुरा मुझे पता है) और इससे कोई परेशानी नहीं थी:

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

1
लक्ष्य नोड के तहत आपकी छवि के लिए XCode प्रोजेक्ट में आप "सापेक्ष से परियोजना" या "सापेक्ष समूह के सापेक्ष" का उपयोग करते हैं? मैं प्रोजेक्ट करने के लिए Relative का उपयोग कर रहा था क्योंकि जानकारी डायलॉग में वह रास्ता दिखाई देता है जब मैं प्रोजेक्ट रिलेटिव को सही लगता है। हालाँकि यह छवि को सही ढंग से लोड करने के लिए प्रकट होता है जब मैं संलग्न समूह के सापेक्ष चुनता हूं। अब मैं सिर्फ जावास्क्रिप्ट और सीएसएस और सभी के साथ सही ढंग से काम करने के लिए अपना पूर्ण पृष्ठ प्राप्त करने जा रहा हूं, धन्यवाद!
मैट पामर्ली

ओह! यह uiwebview बहुत नाजुक है, मैंने धीरे-धीरे अपने टेस्ट पेज पर और अधिक जटिल परीक्षण जोड़ना शुरू कर दिया (यानी img टैग में इनलाइन के बजाय css के साथ छवि सेट करना) और यह काम नहीं कर रहा था इसलिए मैंने वापस वही किया जो मूल रूप से मेरे पास था और यह नहीं किया 'फिर से काम नहीं! शायद मैं अपने 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, जावास्क्रिप्ट आदि।


2

उत्तर स्विफ्ट 2।

UIWebView कक्षा संदर्भ webView.loadRequest (अनुरोध) का उपयोग कर के खिलाफ सलाह देता है:

स्थानीय HTML फ़ाइलों को लोड करने के लिए इस पद्धति का उपयोग न करें; इसके बजाय, loadHTMLString का उपयोग करें: आधार:।

इस समाधान में, html को एक स्ट्रिंग में पढ़ा जाता है। Html के url का उपयोग पथ को काम करने के लिए किया जाता है, और इसे बेस 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 की टिप्पणी लोडर असेंबली के इंस्टेंस मेथड पेज पर है:
जेफ़

0

मैं वापस गया और परीक्षण किया और इसे फिर से परीक्षण किया, ऐसा प्रतीत होता है कि मुझे काम करने का एकमात्र तरीका है (क्योंकि मेरे पास img फ़ोल्डर में कुछ फाइलें हैं और कुछ में js / css, आदि ...) नहीं है HTML में मेरी छवि के लिए एक सापेक्ष पथ का उपयोग करें और बंडल फ़ोल्डर के लिए संदर्भित सब कुछ है। कितनी शर्म की बात है :(।

<img src="myimage.png" />

0

@ स्विफ्ट 3 में sdbrain का जवाब:

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

-1

स्विफ्ट में 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.