โหลดทรัพยากรจากเส้นทางสัมพัทธ์โดยใช้ html ในเครื่องใน uiwebview


121

ฉันมีแอป iOS ที่เรียบง่ายพร้อม uiwebview ที่โหลดหน้าทดสอบที่เรียบง่ายมาก (test.html):

<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 ของฉัน . ต้องมีวิธีทำเช่นนี้ฉันมีไฟล์รูปภาพ, css, javascript จำนวนมากที่ฉันต้องการโหลดลงใน webview และฉันไม่ต้องการให้มีทุกอย่างในรูทและต้องเปลี่ยนการอ้างอิงทั้งหมดในเว็บของฉัน แอป

คำตอบ:


286

นี่คือวิธีโหลด / ใช้ html ในเครื่องพร้อมการอ้างอิงแบบสัมพัทธ์

  1. ลากทรัพยากรไปยังโปรเจ็กต์ xcode ของคุณ (ฉันลากโฟลเดอร์ชื่อ www จากหน้าต่างโปรแกรมค้นหาของฉัน) คุณจะได้รับสองตัวเลือก "สร้างกลุ่มสำหรับโฟลเดอร์ที่เพิ่ม" และ "สร้างการอ้างอิงโฟลเดอร์สำหรับโฟลเดอร์ที่เพิ่ม"
  2. เลือกตัวเลือก "สร้างการอ้างอิงโฟลเดอร์ .. "
  3. ใช้รหัสที่กำหนดด้านล่าง มันควรจะทำงานอย่างมีเสน่ห์

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

ตอนนี้ลิงก์สัมพัทธ์ทั้งหมดของคุณ (เช่น img / .gif, js / .js) ใน html ควรได้รับการแก้ไข

สวิฟต์ 3

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

1
โหวต Super and Up! ใครช่วยอธิบายได้ไหมว่าทำไม "สร้างการอ้างอิงโฟลเดอร์เนื่องจากคัดค้าน" สร้างกลุ่มสำหรับโฟลเดอร์ที่เพิ่มเข้ามา "
ฌอน

3
ในฐานะที่เป็นเครื่องมือหากคุณพยายามโหลดไฟล์จาวาสคริปต์ซึ่งต่างจากรูปภาพคุณจะต้องดูสิ่งนี้ด้วยเช่นกัน: stackoverflow.com/a/3629479/385619
Willster

2
จะเกิดอะไรขึ้นถ้าไดเร็กทอรีnโฟลเดอร์อยู่ลึก? สามารถส่งสตริงเช่น@"www/app"สำหรับไดเรกทอรี arg ได้หรือไม่
ray

1
จะเกิดอะไรขึ้นถ้าเราโหลด html จากเอกสารไม่ใช่จาก Bundle?
chipbk10

@Sean XCode โดยค่าเริ่มต้นจะจัดเก็บไฟล์ทั้งหมดที่เพิ่มในโฟลเดอร์รูทกลุ่มต่างๆมีไว้สำหรับทำให้แผนผังโครงการของคุณดูดีเท่านั้น การอ้างอิงโฟลเดอร์คัดลอกเนื้อหาตามที่เป็นจริงโดยรักษาโครงสร้างไดเร็กทอรี เป็นสิ่งสำคัญมากหากคุณต้องการให้เส้นทางสัมพัทธ์ของคุณทำงานบนอุปกรณ์เช่นเดียวกับที่ทำบนเครื่องสำนักงานของคุณ
Combuster

24

ใน Swift:

 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 ทำงานได้ดีพร้อมกับคำตอบที่ยอมรับ
Bala Vishnu

ยินดีต้อนรับ! :.) @Bala Vishnu
Weles

ใช้งานได้ดีฉันต้องแกะrequestURLมันออก
RRikesh

5

ฉันอัดทุกอย่างเป็นบรรทัดเดียว (ฉันรู้ไม่ดี) และไม่มีปัญหากับมัน:

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

1
ในโปรเจ็กต์ XCode สำหรับรูปภาพของคุณภายใต้โหนดเป้าหมายคุณใช้ "Relative to project" หรือ "Relative to Enclosing Group" ฉันใช้ Relative to project เพราะในกล่องโต้ตอบรับข้อมูลเส้นทางที่แสดงเมื่อฉันเลือก Relative to project ดูถูกต้อง อย่างไรก็ตามดูเหมือนว่าจะโหลดภาพได้อย่างถูกต้องเมื่อฉันเลือกที่สัมพันธ์กับกลุ่มที่ปิดล้อม ตอนนี้ฉันเพิ่งไปเพื่อให้หน้าเต็มของฉันทำงานได้อย่างถูกต้องกับ javascript และ css และขอขอบคุณ!
Matt Palmerlee

ฮึ uiwebview นี้บอบบางมากฉันเริ่มเพิ่มการทดสอบที่ซับซ้อนขึ้นในหน้าทดสอบของฉันอย่างช้าๆ (เช่นการตั้งค่ารูปภาพด้วย css แทนที่จะเป็นอินไลน์ในแท็ก img) และมันไม่ทำงานฉันจึงย้อนกลับไปที่เดิม แต่มันก็ไม่ได้ ไม่ทำงานอีกแล้ว! บางทีฉันกำลังจัดการกับแคชบางประเภทใน uiwebview ของฉัน
Matt Palmerlee

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: baseURL :.

ในโซลูชันนี้ html จะถูกอ่านเป็นสตริง url ของ html ถูกใช้เพื่อกำหนดเส้นทางและส่งผ่านสิ่งนั้นเป็น 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)

หากเป็นกรณีนี้จะเป็นการดีที่จะอ้างถึงตำแหน่งในคู่มือที่แนะนำเรื่องนี้และแทรกข้อความที่ตัดตอนมาจากหน้านั้น - ดูเหมือนว่าจะไม่มีบริบทมากในขณะนี้
Ben Cox

ความคิดเห็นของ Apple อยู่ในหน้า Instance Method สำหรับ loadRequest:
Jeff

0

ฉันได้กลับไปทดสอบและทดสอบอีกครั้งดูเหมือนว่าวิธีเดียวที่ฉันจะทำให้มันใช้งานได้ (เนื่องจากฉันมีไฟล์บางไฟล์ในโฟลเดอร์ img และบางไฟล์ใน js / css ฯลฯ ... ) ไม่ให้ ใช้เส้นทางสัมพัทธ์ไปยังรูปภาพของฉันใน html และมีการอ้างอิงทุกอย่างไปยังโฟลเดอร์บันเดิล น่าเสียดายจัง :(.

<img src="myimage.png" />

0

คำตอบของ @ sdbrain ใน Swift 3:

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

-1

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