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 내의 Targets-> Copy Bundle Resources 아래의 루트 경로에 넣으면 제대로 작동하지만 내 html 파일에 표시된대로 상대 경로에서 작동하도록 가져올 수 없습니다. . 이 작업을 수행하는 방법이 있어야합니다. 웹뷰에로드하고 싶은 이미지, CSS, 자바 스크립트 파일이 많으며 루트에 모든 것을 포함하지 않고 웹의 모든 참조를 변경해야합니다. 앱.

답변:


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
Super and Up이 투표했습니다! 누구든지 "추가 된 폴더에 대한 그룹 만들기"와 반대로 폴더 참조를 만드는 이유를 설명 할 수 있습니까?
Sean

3
참고로, 이미지가 아닌 자바 스크립트 파일을로드하려는 경우 이것도 살펴 봐야합니다. stackoverflow.com/a/3629479/385619
Willster

2
디렉토리가 n 폴더 깊이 이면 어떻게 됩니까? @"www/app"디렉토리 arg 와 같은 문자열을 전달해도 괜찮 습니까?
ray

1
번들이 아닌 문서에서 html을로드하면 어떨까요?
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 2014

잘 작동 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 2011 년

어! 이 uiwebview는 너무 취약해서 테스트 페이지에 더 복잡한 테스트를 천천히 추가하기 시작했습니다 (예 : img 태그에서 인라인 대신 CSS로 이미지 설정). 다시 작동하지 않습니다! 내 uiwebview에서 일종의 캐싱을 다루고 있습니까?
Matt Palmerlee 2011-06-22

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은 문자열로 읽혀집니다. 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)

이 경우 매뉴얼에서이 내용을 조언하는 곳을 참조하고 해당 페이지에서 발췌 한 내용을 삽입하는 것이 좋습니다. 현재로서는 문맥이없는 것 같습니다.
Ben Cox

Apple의 의견은 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

WKWebView를 사용하는 Swift 3.01에서 :

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 파일을 포함 할 수 있도록 디렉토리 구조를 제자리에 유지합니다.


3.x 이후 주요 기반 유형에 대해 NS 접두사가 누락되지 않았습니까? 그것은 나를 위해 속임수를 썼습니다, 감사합니다! 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.