2010-05-12 5 views
7

WebKit WebView를 사용하는 응용 프로그램이 있는데이 WebView에로드 된 URL을 사용자 지정 URL 프로토콜과 함께 다른 HTTP URL에 매핑하고 싶습니다.사용자 지정 URL 프로토콜을 HTTP로 매핑 (NSURLProtocol? 사용)

사용자 정의 : 예를 들어, 나는로드하고 말할 // 경로// 자원

내가 내부적으로 실제로 부하에 싶습니다 즉

http://something-else.com/path/to/resource

, 사용자 정의 프로토콜 제공 거의 속기로서. 그러나 WebKit에서 실제로이 URL을 믿고 싶기 때문에 -webView : resource : willSendRequest : redirectResponse : fromDataSource :를 사용할 수 없습니다. 단순히 다른 URL로 리디렉션하지 말아야합니다.

지금까지 사용자 지정 NSURLProtocol 하위 클래스를 사용하려고 시도했습니다. 그러나, 적어도 내 이해하기 때문에, NSURLProtocol 하위 클래스 인 'startLoading 메서드'에서 실제로드를 직접 수행해야하기 때문에 이것은 처음 생각한 것보다 까다로울 수 있습니다. 기존의 HTTP 프로토콜 로더에 작업을 전달하는 방법을 원하지만이 작업을 수행하는 쉬운 방법을 찾을 수 없습니다.

이 문제에 대한 권장 사항이 있습니까? 아니면 다른 방법으로 해결할 수 있습니까?

감사합니다.

답변

3

정책 위임을 사용합니다. 그것은 몇 가지 단점을 가지고 있지만, 간단하고 내 요구에 충분합니다. 나는 다음과 같이한다 :

- (void)webView:(WebView *)webView decidePolicyForNavigationAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request frame:(WebFrame *)frame decisionListener:(id <WebPolicyDecisionListener>)listener; 

{ 
    if ([request.URL.scheme isEqualToString:@"custom"]) { 

     // do something interesting 
     // like force the webview to load another URL 

     [listener ignore]; 
     return; 
    } 

    [listener use]; 
} 

내 용도로는 JS 이벤트 전파를 중지해야한다. 따라서 일반적으로 window.event.stopPropagation()을 호출하는 onclick 이벤트 핸들러에 URL을 넣습니다. location.href를 설정 한 후

아주 환상적이지는 않지만, JS 이벤트를 코코아와 통신하는 데 매우 유연하고 매우 간단한 방법입니다.

- (NSURLRequest *)webView:(WebView *)sender resource:(id)identifier willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse fromDataSource:(WebDataSource *)dataSource 

이 당신이 HTTP URL을 하나에 대한 요청을 변경할 수 있도록해야합니다

+0

이것이 웹 뷰를 맞춤 프로토콜 URL에서 생각하게 만드는 효과가 있습니까? if-block에서 새로운 URL을 단순히로드하면 이전과 같은 위치에있게 될 것입니다. 효과적으로 리디렉션을 만듭니다. 하지만 아마도 내가 거기에서 새로운 URL을로드하기로되어있는 패션을 오해하고 있습니다. –

+0

"웹뷰를 사용자 정의 프로토콜 URL에서 생각하게하는 효과가 있습니까?" 아니요, 확실히 아닙니다. 목표가 href.location을 한 가지로 설정하고 다른 href.location을로드하는 것이라면이 솔루션은 거기에 도달하지 못합니다. 죄송합니다. 이 경우 사용자 정의 구성표가 감지되면 심지어 죽게됩니다. 따라서 location.href는 절대로 변경되지 않습니다. "효과적으로 리디렉션을 만듭니다" 리디렉션과 다릅니다. 리디렉션에서는 첫 번째 URL이로드되고 처리되며 다음 URL이로드됩니다. 정책 대리자를 사용하고 [listener ignore]를 호출하면 첫 번째 URL로드가 완전히 중단됩니다. – isaiah

0

당신은 WebResourceLoadDelegate 방법을 구현할 수 있습니다.

NSURLProtocol 하위 클래스를 구현하는 것은 그다지 어렵지 않습니다. 프로토콜에서 올바른 012 URL을 사용하여 다른 NSURLConnection을 내부적으로 실행하고 해당 대리인 메서드를 프로토콜 클라이언트에 매핑 할 수 있기 때문입니다.

관련 문제