2011-11-03 3 views
4

iOS 앱에는 file : URL에서 페이지를 렌더링하는 웹보기가 있습니다. 사용자가 페이지, 시간의 약 20 %를 전환 할 수있는 <A> 요소를 터치하면 다음과 같이이 걸리면 :webViewDidStartLoad 후에 UIWebView가 멈춤

  1. 사용자 <A> 링크를 탭
  2. 우리는 WebView.shouldStartLoadWithRequest 콜백을 얻을
  3. 우리는 웹보기를 얻을. 이

화면이 여전히에 대한 링크가있는 원래의 페이지를 보여줍니다 후 webViewDidStartLoad 콜백

  • 아무 반응이 없습니다. 우리는 두 가지 방법으로 정체를 깰 수 :
    1. 페이지를 즉시로드가 완료되며, 그 시점에서 화면

    를 눌러 장치

  • 을 돌립니다.

    우리는 여기에서 조리법을 사용 :

    Javascript console.log() in an iOS UIWebView

    우리에게 페이지로드에 몇 가지 통찰력을 허용 할 수 있습니다. 페이지에로드하는 첫 번째 스크립트 파일에 javascript 쪽 항목을 넣고 회전 또는 탭 임시 해결 방법을 수행 할 때까지 메시지를 인쇄하지 않습니다.

    그래서 페이지를로드하기 시작하고 페이지의 내용을 평가하기 시작하는 사이에 어딘가에 붙어있는 것처럼 보입니다.

    우리는 해결 방법, 도움이 중 어느 것도 다수 시도 :

    • 이 같이 location.href 설정 대신에서 같이 location.href 설정 태그
    • 를 사용을 didStartLoad에서 자바 스크립트 시간 제한
    • 콜백, webView에서 setNeedDisplay를 호출 한 스레드를 계속 작성했습니다.

    우리가 잘못했을 수도 있습니다.

  • +0

    페이지의 모든 내용이나 모든 내용을 주석 처리하고 문제를 복제 할 수 있습니까? 그것은 진단에 대한 나의 첫 번째 접근 방법이 될 것입니다. 페이지 크기/메모리 문제 일 수 있습니다. 응용 프로그램 메모리 오류가 있으면 NSLog'ging 있습니까? –

    +0

    내 앱에서 이상한 동작이 발생합니다. 해결책을 찾았습니까? – olfuerniss

    +0

    아직 답이 없습니다. 비록 우리가 혼자가 아니라고 다소 기쁩니다. 나는 완전히 사소한 페이지로 문제를 보았다. 말했듯이, 우리는 우리가 가고있는 페이지의 시작 부분에 로깅을 추가하려고 시도했지만, 그것은 일어나지 않는다. 그래서 webkit은 이전 페이지를 남겨두고 새로운 페이지를로드하기 시작했지만, 아무것도 파싱하기 전에 막 중단되었습니다. –

    답변

    2

    Xcode에서 gdb를 사용하여 문제를 디버깅 할 수 있습니다.나는 브레이크 포인트를 가질 수 메시지 canidates이 생각 : 그럼 당신은을 통해 희망 캐치 단계 수

    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
    

    :

    - (void)webViewDidStartLoad:(UIWebView *)webView 
    - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
    

    가 나는 또한 UIViewController가 당신의 UIWebView를 보여주는 어떤에서 휴식을 추가 할 것 UIWebView 하위 클래스의 문제점.

    중단 점을 추가하지 않으려면 Xcode 디버거에서 앱을 실행하고로드하는 동안 앱이 응답하지 않을 때 콘솔 창 위의 '실행 일시 중지'버튼을 누르십시오.

    GDB Pause Execution Button

    이 떨어져 갈 코드없이 진행하지만 내가 엑스 코드는 당신이 문제를 신속하게 찾을 수 있습니다 내기 무엇을 알고 어렵다.

    행운을 빈다.

    +0

    이것은 우리가 필요로 한 단서입니다. 우리가 알아 낸 점은 UIWebView와 OpenGL 렌더링 코드 사이에 부드러운 교착 상태가 있다는 것입니다. 우리는 OpenGL 이미지를 통해 웹보기를 겹쳐 씁니다. 세마포어를 기다리는 동안 웹보기가 끊어졌습니다. 페이지로드 중 GL 새로 고침 루프를 끄기 만하면 문제가 해결되었습니다. –

    0

    필자의 경우이 이상한 행동에 대한 해결책을 찾았습니다.

    내 응용 프로그램에서는 UIWebView의 하위 클래스를 만들었습니다. Apples 설명서에서 UIWebView의 하위 클래스를 작성하면 안된다는 점을 알고 있습니다. 하지만 그것은 내 앱에서 "필수적"입니다.

    문제는 scrollViewDidEndDragging : willDecelerate : super를 호출하지 않고 덮어 썼습니다. html로 링크를 눌러 때 지금은 항상 웹 사이트를로드

    - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
        [super scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; 
        // my code 
    } 
    

    - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
        // my code 
    } 
    

    이된다.

    +0

    우리는 UIWebView를 서브 클래 싱하고 있었지만 그 메소드를 오버라이드하지는 않았습니다. 어쨌든, 우리는 서브 클래 싱을 제거하기 위해 리팩터링했습니다 ("should not"였음을 깨닫지 못했습니다). 문제는 여전히 남아 있습니다. –

    관련 문제