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.