2013-01-16 2 views
9

나는 UIWebView을 가지고 있으며 사용자가 링크를 탭할 때 무엇인가해야합니다. 도청을 감지하는 데 사용할 수있는 대리자 콜백이있다 :UIWebView에서 링크 클릭을 안정적으로 감지하는 방법은 무엇입니까?

- (BOOL) webView: (UIWebView*) webView 
    shouldStartLoadWithRequest: (NSURLRequest*) request 
    navigationType: (UIWebViewNavigationType) navigationType 
{ 
    if (navigationType == UIWebViewNavigationTypeLinkClicked) { 
     … 
    } 
} 

문제는이 코드는 모든 링크 클릭을 처리하지 않는다는 것입니다. 링크를 탭하면 UIWebViewNavigationTypeLinkClicked 이벤트를 트리거하지에

<a href="http://example.com/" class="l" onmousedown="return rwt(…)"> 
    <em>Link Text</em> 
</a> 

rwt 기능 결과 : 예를 들어, 일반 Google 검색 결과 페이지의 링크에 뭔가 이상한 않습니다. '다른 페이지로 이동'버킷에 속하는 모든 이벤트를 안정적으로 감지하는 방법이 있습니까?

답변

6

지금까지 나는 다음과 같은 솔루션에 도착했습니다. 로드 첫째, 나는 페이지에 일부 JS 코드를 삽입 : 사용자가 링크를 탭하면

function reportBackToObjectiveC(string) 
{ 
    var iframe = document.createElement("iframe"); 
    iframe.setAttribute("src", "callback://" + string); 
    document.documentElement.appendChild(iframe); 
    iframe.parentNode.removeChild(iframe); 
    iframe = null; 
} 

var links = document.getElementsByTagName("a"); 
for (var i=0; i<links.length; i++) { 
    links[i].addEventListener("click", function() { 
     reportBackToObjectiveC("link-clicked"); 
    }, true); 
} 
, 내가 webView:shouldStartLoadWithRequest: navigationType: 위임 호출에 대한 사전 감사에 그것을 알고

: 다음

if ([[[request URL] scheme] isEqualToString:@"callback"]) { 
    [self setNavigationLeavingCurrentPage:YES]; 
    return NO; 
} 

다른 요청이 올 경우 _navigationLeavingCurrentPage이 참이라면 탐색 유형 플래그가 UIWebViewNavigationTypeOther인데도 사용자가 링크를 클릭했음을 알고 있습니다. 나는 솔루션을 광범위하게 테스트해야합니다. 오탐 (false positive)이 발생할 수 있습니다.

1

웹 사이트의 HTML 코드에 이벤트를 모니터링하는 맞춤 자바 스크립트를 삽입하고 모니터링하려는 이벤트에 따라 맞춤 URL 스키마로 페이지 리디렉션을 트리거 할 수 있다고 생각합니다. , 당신은 shouldStartLoadWithRequest에서 요격 할 수 있습니다. 이 같은

뭔가 :

<script> 
// Function to capture events 
function captureEvent(el) { 
    window.location.href="callback://"+el.href; 
} 

var elms = document.getElementsByTagName("a"); 
for (var i=0; i<elms.length; i++) { 
    elms[i].addEventListener("onmousedown", function(){captureEvent(el)}, true); 

} 
</script> 

는 그 다음 shouldStartLoadWithRequest에, 당신이 NSURLRequest의 콜백을 가질 수를 검색 할 수 있습니다 : // URL 방식, 그리고 당신이 원하는 무엇이든 할.

이것은 테스트되지 않았지만 이와 같은 경우 올바른 방향으로 갈 수 있습니다. 이 언급 된 이후 또한

는, 그래 당신은이를 사용하여 웹 페이지에 사용자 지정 스크립트를 추가 할 수 있습니다

- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    [super webViewDidFinishLoad:webView];  
    [webView stringByEvaluatingJavaScriptFromString:@"document.body.insertAdjacentHTML('BeforeEnd','<script>....</script>');"]; 
} 
+0

나는 OP가 UIWebView에 표시되는 웹 페이지를 제어하지 않는다고 생각합니다. 따라서 사용자 정의 javascript를 추가 할 수 없습니다. –

+1

페이지가로드 된 후 사용자 지정 스크립트를 쉽게 추가 할 수 있습니다. 이 작업을 수행하는 방법에 대한 내 편집을 참조하십시오. – Lefteris

+0

페이지에 사용자 정의 javascript를 추가하는 방법을 추가하는 것은 매우 좋습니다. –

0

나는 이것을 작동시키는 데 많은 어려움을 겪었습니다. UITapGestureRecognizer를 사용하면 링크에 대해서도 항상 탭을 수신한다는 점만 다릅니다. 안타깝게도 링크가 인식되기까지 약 300ms의 지연이 있습니다. 즉, 제스처 인식기가 링크가 인식되기 전에 탭을 얻음을 의미합니다. 타이밍 문제가 발생합니다 (경우에 따라 기다릴 시간을 하드 코딩해서는 안되기 때문에 더 심합니다). Apple이 변경). 또한 탭을 300 초 이상 대기하면 내 앱에 대한 사용자 환경이 좋지 않습니다.

그래서 내가 끝낸 것은 비 링크 탭을 얻는 모든 것 위에 투명 div를 오버레이하는 것이 었습니다. 그런 다음 링크를 높은 z 레벨에 놓습니다. 마지막으로, 모든 것이 ontouchend="javascript:window.location.href='...';"을 사용하는지 확인하십시오. ontouchend는 사용자가 기대하는 탭 릴리스에서만 작동합니다. window.location.href를 설정하면 새 탭이로드되어 모든 탭에서 -webView:shouldStartLoadWithRequest:navigationType:을 호출하고 URL을 확인하여 수행해야 할 작업을 확인할 수 있습니다.

HTML 형식 : ... ... ... ... ...

("위치 : 상대"는 항상 다른 위치와 동일한 위치에 배치하지만 완전히 단순한 페이지에서는 잘 작동하지 않을 수 있습니다.) , 당신은 것입니다 위치를 필요로 : 뭔가를 Z- 인덱스가 작동하도록하기 위해)

1

당신이 줄

를 추가 할 필요가

webView.dataDetectorTypes = UIDataDetectorTypeAll;. (있는 UIWebView *) inWeb shouldStartLoadWithRequest : (NSURLRequest *) inRequest navigationType : (UIWebViewNavigationType) INTYPE는

방법은 얻을 것이다 호출 후

  • (BOOL) 웹보기

.

관련 문제