iOS UIWebView 에서 웹 제목 을 가 져 올 수 없 는 해결 방법

최근 에 문제 가 발생 했 습 니 다.UIWebView 의 프 록 시 방법 에서 document.title 을 실행 하 는 js 코드 는 웹 페이지 제목 을 가 져 올 수 없습니다.코드 는 다음 과 같 습 니 다.

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
  //    html      
  NSString *title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
}
이 문제 가 발생 하면 나 는 먼저 코드 의 문제 인지 아 닌 지 를 확인 하고 분석 한 결과 코드 가 바 뀌 지 않 았 지만 이번 에는 웹 페이지 의 제목 을 얻 지 못 하 는 것 이 매우 이상 하 다.검색 분석 을 통 해 문 제 는 이 버 전에 서 전단 인원 이 웹 페이지 의 제목 을 비동기 동작 에 설정 하여 UIWebView 가 웹 페이지 를 불 러 오 는 것 이 완 료 된 후에 프 록 시 방법 인 webView Did FinishLoad:에서 제목 을 바로 가 져 올 수 없습니다.제목 을 가 져 오 는 방법 은 비동기 이기 때문에 웹 페이지 를 불 러 오 면 이 프 록 시 방법 을 호출 합 니 다.그 때 웹 페이지 title 은 아직 값 이 없 었 습 니 다.타이틀 값 을 가 져 올 수 없습니다.
다음은 웹 페이지 비동기 로 title 을 가 져 오 는 코드 입 니 다.jQuery 와 Ajax 기술 을 사용 하여 다른 단계 로 title 을 가 져 옵 니 다.

 $.ajax({
    url: remoteur+'/api/innerMessageApi/noticeMessage.htm?callBackFunc=xx',
    type: 'get',
    dataType: 'jsonp',
    jsonpCallback:"xx",
    data: {msgId: msgId},

    success: function(res){
      console.log(res);
      if ( res.successFlag == 'Y' ){
        content = res.content;
        title  = res.title;
      }
    },
    complete:function(res){
      document.title = title;
      $('body').append(content);
    }
  })

이 문제 가 발생 했 을 때 마침 프로젝트 가 출시 되 는 그날 밤 에 단체 야근 을 할 때 이 문제 에 부 딪 혀 그날 밤 에 깊 은 상 처 를 받 은 것 을 느 꼈 다.
자,잡담 은 그만 하고 해결책 을 소개 하 겠 습 니 다.
방법 1
iOS 방면 의 해결 방법 만 고려한다 면 title 을 지연 시 키 는 것 일 수 있 습 니 다.구체 적 으로 는 webView Did FinishLoad:에서 document.title 을 지연 시 켜 제목 을 얻 는 것 입 니 다.해결 할 수 있 지만 위험 합 니 다.웹 페이지 에서 제목 을 얻 는 것 은 비동기 적 이 고 다른 단계 의 시간 이 확실 하지 않 기 때문에 지연 시간 도 확실 하지 않 습 니 다.지연 시간 을 늘 릴 수 있 지만,하지만 완벽 한 해결책 은 아 닐 까?

  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)),    

  dispatch_get_main_queue(), ^{
    self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
  });

방법 2
웹 페이지 엔 드 를 고려 하면 웹 페이지 에서 title 을 가 져 오 는 비동기 작업 을 동기 화 작업 으로 바 꿀 수 있 습 니 다.상기 js 코드 에 따라 동기 화 필드 async:false 를 추가 할 수 있 습 니 다.수 정 된 웹 페이지 코드 는 다음 과 같 습 니 다.

$.ajax({
    url: remoteur+'/api/innerMessageApi/noticeMessage.htm?callBackFunc=xx',
    type: 'get',
    dataType: 'jsonp',
    jsonpCallback:"xx",
    data: {msgId: msgId},
    //       
    async: false,

    success: function(res){
      //       
       document.title = res.title;
    complete:function(res){
      ...
    }
  })

비록 이렇게 하면 이 문 제 를 해결 할 수 있 지만 여전히 좋 은 해결 방법 이 아니다.예 를 들 어 웹 페이지 를 불 러 올 때 동기 화 된 방식 으로 웹 페이지 제목 을 얻는다.만약 에 동기 화 작업 이 막 히 면 웹 페이지 의 불 러 오기 가 막 혀 서 웹 페이지 를 보 여줄 수 없 기 때문에 가장 좋 은 해결 방법 이 아니다.
방법
웹 페이지 엔 드 와 iOS 엔 드 를 결합 하면 웹 페이지 에서 다른 단계 로 제목 을 가 져 올 수 있 습 니 다.제목 을 가 져 온 후에 js 를 통 해 원생 의 방법 으로 제목 을 설정 할 수 있 습 니 다.그러면 제목 을 동기 화하 여 웹 페이지 로 딩 과정 을 막 지 않 을 수도 있 고 제목 을 가 져 오 는 데 지연 되 어 시간 이 정 해 지지 않 는 문제 가 되 지 않 기 때문에 이 방법 은 이 문 제 를 완벽 하 게 해결 할 수 있 습 니 다.
js 엔 드 코드:

$.ajax({
    url: remoteur+'/api/innerMessageApi/noticeMessage.htm?callBackFunc=xx',
    type: 'get',
    dataType: 'jsonp',
    jsonpCallback:"xx",
    data: {msgId: msgId},
    //       
    async: false,

    success: function(res){
      //       
      document.title = res.title;
      // js           
      setWebViewTitle(title); 
    complete:function(res){
      ...
    }
  })

iOS 엔 드 코드:

  context[@"setWebViewTitle"] = ^(){
    NSArray *args = [JSContext currentArguments];
    if (args.count == 1) {
      //     ,         
      self.title = [args firstObject];
    }
  };
사실은 js 가 원생 을 호출 하 는 방식 이 매우 많 습 니 다.여 기 는 비교적 간단 한 방식 일 뿐 구체 적 으로 어떤 방식 으로 든 가능 합 니 다.만약 에 이 지식 에 대해 잘 모 르 면 다른 자 료 를 참고 할 수 있 습 니 다.
저 는 인터넷 에서 많은 자 료 를 찾 았 는데 사이트 제목 을 동적 으로 수정 하 는 것 은 대부분이 동기 화 작업 이라는 것 을 발 견 했 습 니 다.비동기 로 동적 으로 제목 을 수정 하 는 것 을 소개 하지 않 았 습 니 다.그래서 저 는 동적 으로 제목 을 설정 하 는 방법 을 위 와 같이 정리 하고 필요 한 친구 에 게 도움 을 주 고 싶 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기