神奇的 iOS 11中 UIWebView 页面内锚点失效问题

苹果的每一次升级,都让广大的iOS开发者又爱又恨:一方面,新的API的引入让程序员可以更好的发挥硬件的潜力为用户带来新功能;另一方面,iOS的向后兼容从来不是一件省心的事,以前工作得好好的功能可能就停摆了,或者以前正常的显示,可能在新版本里就错乱了。

这次iOS11的到来也是一样的,我们为新的功能惊喜,也为潜在的问题而忧虑。比如新的模拟器看起来高大上,可以居然不在可以随便设置分辨率。在macbook上都没法为 iPad Pro 12.9' 截屏了!

最近有用户反应MarkNote笔记目录( [TOC])不能跳转。研究了一下发现是<a name=name-of-link>定义的锚点失效了。进一步的研究发现:

  • 不光我的应用存在这个问题,其他凡是在 UIWebView 中加载本地HTML文件或者字符串的应用也一样都存在这个问题;
  • 如果页面是 HTTP/HTTPS协议的则没有问题;
  • 如果页面是 file:/// 协议的则使用<a name=name-of-link>定义的锚点失效;
  • 同样的功能在 iOS 10.3上运行正常;

在UIWebView的事件中设端点发现,点击锚点时还是触发了shouldStartLoadWithRequest 事件,但是 didFailLoadWithError 中没有任何错误。看起来的感觉是, UIWebView 看到是 file:/// 协议的就不理睬锚点的跳转了。

既然如此,看来需要在 shouldStartLoadWithRequest 事件中做文章,注入一段javascript,让锚点滚动到可见区域来。简单的弄了一个方案:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    if (UIWebViewNavigationTypeLinkClicked == navigationType
        && [@"file" isEqualToString:[[request URL] scheme] ]) {
        NSArray<NSString*>* components = [request.URL.absoluteString componentsSeparatedByString:@"#"];
        if (components.count == 2) {
                NSString* anchor = components.lastObject;
            NSString* code = [NSString stringWithFormat:@"let element = document.getElementsByName(\"%@\")[0]; if (element) {element.scrollIntoView();}", anchor];
                [webView stringByEvaluatingJavaScriptFromString:code];
                return NO;
        }
    }
// 其他逻辑
}

测试通过。准备再测试一下,然后默默的发一个补丁了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,294评论 4 61
  • 日记本的扉页上写着:永远都不会忘记,却永远都不会想起。 一 初次见面是在高中教学楼楼顶抻出的阳台上,阳台很...
    逆旅杏仁阅读 496评论 6 5
  • 春天到了,我和小伙伴们一起去寻找春天。 我们在小动物身上找春天,看见燕子从南方飞回来了,小蜜蜂又开始辛...
    凡间客阅读 859评论 0 1
  • 中午没睡觉,看完了“滚蛋吧-肿瘤君”,之前看过一些漫画,但是没看进去。看电影还是挺有感触的,觉得还是应该记录下现在...
    小小常阅读 357评论 0 0
  • 我们扯平了,从今往后,我要当你没有存在过。我要当以前的日子根本没有来过,我要当我自己今天才来到这个世上,我要开始我...
    吐泡泡的鱼_2015阅读 801评论 2 8