วิธีโหลดไฟล์ html โลคัลลงใน UIWebView


165

ฉันกำลังพยายามโหลดไฟล์ html ลงใน UIWebView ของฉัน แต่มันไม่ทำงาน นี่คือขั้นตอน: ฉันมีโฟลเดอร์ชื่อ html_files ในโครงการของฉัน จากนั้นฉันสร้าง webView ในเครื่องมือสร้างอินเตอร์เฟสและกำหนดทางออกให้กับมันใน viewController นี่คือรหัสที่ฉันใช้เพื่อต่อท้ายไฟล์ 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 ดังต่อไปนี้:

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

รวดเร็ว

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

Swift 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

ดังนั้นนั่นหมายความว่าทรัพยากรไม่พบ ตรวจสอบด้วย just: NSString * htmlFile = [[NSBundle mainBundle] pathForResource: @ "ตัวอย่าง" ofType: @ "html"]; ไม่มี inDirectory
user478681

โดยไม่มี inDirectory ฉันได้: iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.htmlแต่ html ไม่ปรากฏขึ้นในหน้าจอมันยังว่างเปล่า ฉันฉันหายไปอย่างอื่น? นี่คือตัวอย่างโครงการ: http://www.box.net/shared/rb05b4ppjnbof1r33gh7
madcoderz

3
คุณเพียงแค่ต้องแก้ไขเฟรมของมุมมองเว็บของคุณ
user478681

3
คำตอบนี้มีคะแนนโหวตจำนวนมาก แต่ดูเหมือนจะล้าสมัย เนื้อหารูปภาพและ CSS ในตัวเครื่องจะไม่โหลดโดยใช้วิธีนี้ ดูคำตอบนี้แทน
paulmelnikow

90

แก้ไข 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 ย้ายมาตั้งแต่คำตอบเดิมฉันคิดว่า ขอบคุณ
James

ขอบคุณสำหรับคำตอบนี้ สิ่งที่แตกต่างเกี่ยวกับเรื่องนี้กับคำตอบที่ยอมรับคือลิงก์ในเอกสาร HTML ที่ทำงาน
เอมี่

2
ตาม Apple เพื่อช่วยให้คุณหลีกเลี่ยงความเสี่ยงต่อการโจมตีด้านความปลอดภัยโปรดใช้ loadHTMLString: baseURL: เพื่อโหลดไฟล์ HTML ในเครื่อง อย่าใช้ loadRequest:
ED-209

คำตอบที่ยอมรับไม่ได้สำหรับฉัน ขอบคุณ @neal Ehardt คำตอบนี้ใช้ได้สำหรับฉัน
Mihir Oza

สิ่งนี้ใช้ได้กับฉันหากไฟล์ html ไม่ได้อยู่ในโฟลเดอร์ใด ๆ
Renan Franca

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

รับเส้นทางของการตรวจสอบไฟล์ html โดย NSLog
AJPatel

สมาชิกเป้าหมายของไฟล์ html ควรจะตรวจสอบอย่างอื่นยกเว้นต่อไปนี้จะได้รับการโยน: app -Terminating เนื่องจากการยกเว้น uncaught 'NSInvalidArgumentException' เหตุผล '*** - [NSURL initFileURLWithPath: isDirectory:]: สตริงศูนย์พารามิเตอร์'
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

สำหรับ Swift 3 และ Swift 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 = "... " />
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 ของคุณไม่รองรับการเข้ารหัส 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

นี่คือวิธีการทำงานของไฟล์ HTML ด้วย Jquery

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

คุณสามารถใช้การร้องขอเพื่อเรียกไฟล์ HTML ใน UIWebview ของคุณ


3

ตรวจสอบให้แน่ใจว่า "html_files" เป็นไดเรกทอรีในชุดข้อมูลหลักของแอปไม่ใช่เฉพาะกลุ่มใน Xcode


3

วิธีใหม่ในการทำเช่นนี้โดยใช้ swift UIWebView นั้นไม่มีอีกต่อไปและ WKWebView เป็นคลาสใหม่ในการโหลดหน้าเว็บซึ่งช่วยให้แน่ใจว่าฟีเจอร์ของ Safari ไปยังมุมมองเว็บ

    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เป็นคุณควรเพิ่มในnilBuild Phases > Copy Bundle Resources

ป้อนคำอธิบายรูปภาพที่นี่


2

นี่คือ 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 คำตอบของ @ 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 เหนือ "Supporting Files" คุณควรตรวจสอบตัวเลือก "คัดลอกรายการหากจำเป็น" และ "สร้างการอ้างอิงโฟลเดอร์" ถัดไปเขียนรหัสอย่างง่าย:

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

ให้ความสนใจกับ@"manual/index", คู่มือเป็นชื่อของไดเรกทอรีของฉัน !! มันคือทั้งหมด !!!! ขออภัยภาษาอังกฤษที่ไม่ดีของฉัน ...

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

Hola desde คอสตาริกา Ponga los archivos (html y demás recursos) และผู้อำนวยการ (ในคู่มือฉบับย่อ), luego, arrastre y suelte en XCode, sobre "Supporting Files" คลิกเพื่อคัดลอก "คัดลอกรายการหากต้องการ" y "สร้างการอ้างอิงโฟลเดอร์"

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

ก่อนหน้า@"manual/index"นี้, คู่มือการใช้งานโดยผู้อำนวยการ !!


0

เมื่อโครงการของคุณใหญ่ขึ้นคุณอาจต้องมีโครงสร้างเพื่อให้หน้า HTML ของคุณสามารถอ้างอิงไฟล์ที่อยู่ในโฟลเดอร์ย่อย

สมมติว่าคุณลากhtml_filesโฟลเดอร์ของคุณไปที่ Xcode และเลือกตัวเลือกสร้างการอ้างอิงโฟลเดอร์รหัสSwiftต่อไปนี้จะช่วยให้แน่ใจว่า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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.