UIWebView JS 获取网页标题不显示问题

309 阅读1分钟

虽然苹果现在已经放弃了UIWebView但是大量的项目中仍旧在使用UIWebView. 普遍的获取方式为在UIWebView 的 delegate webViewDidFinishLoad 方法中采用 JS 获取的方式

[webView stringByEvaluatingJavaScriptFromString:@"document.title"] 但是项目中遇到在网页加载完成后不能获取到标题的情况,即上面获取的方法返回值为空。 不能正确的获取网页的标题。

经过调研有一下几种解决方案:

  1. 加入延时: dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.navigationItem.title = [self.webView stringByEvaluatingJavaScriptFromString:@"document.title"]; }); 这种方案,粗暴、不够优雅,而且不能确定标题真正设定的时机。可能由于AJAX请求异步设置时存在一定的时间差。但是能解决大部分不通过AJAX动态设置标题的情况。
  2. 加入定时器。每隔一段时间去执行获取标题的JS 方法,当然由于耗费资源,应该在判断缺少没有设置标题时请求,如果有了就要手动停掉定时器。

_intervalTimer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(timerCallBack:) userInfo:nil repeats:YES]


   self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];

   if (self.navigationItem.title) {
      [_intervalTimer invalidate];
      _intervalTimer = nil;
   }
}

这种方式需要手动处理定时器,更完美一些的话需要设定关闭的条件,即循环几次后需要停掉定时器。

以上的2种方式都不需要H5页面的改动,第三种方式是加入H5的回调,这种方式最实时,适用于APP内的H5页面,上面2种可用于不定的URL的活动或者外链。

  1. 第三种方式,是比较安全和合理的方式。就是H5在异步更改或者设置好标题后调用客户端的方式。即JS调用本地的方式,传标题给客户端,客户端根据传值来设定。