虽然苹果现在已经放弃了UIWebView但是大量的项目中仍旧在使用UIWebView. 普遍的获取方式为在UIWebView 的 delegate webViewDidFinishLoad 方法中采用 JS 获取的方式
[webView stringByEvaluatingJavaScriptFromString:@"document.title"]
但是项目中遇到在网页加载完成后不能获取到标题的情况,即上面获取的方法返回值为空。 不能正确的获取网页的标题。
经过调研有一下几种解决方案:
- 加入延时:
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动态设置标题的情况。 - 加入定时器。每隔一段时间去执行获取标题的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的活动或者外链。
- 第三种方式,是比较安全和合理的方式。就是H5在异步更改或者设置好标题后调用客户端的方式。即JS调用本地的方式,传标题给客户端,客户端根据传值来设定。