iOS Cordova& [WKWebView loadHTMLString: baseURL:] 无法正常显示

问题描述:当使用CordovaLib库的CDVViewController控制器中WKWebView通过loadHTMLString: baseURL: 加载html时页面空白,控制台有如下图日志输出:

通过日志我们发现在加载页面时-[CDVIntentAndNavigationFilter shouldOverrideLoadwithRequest:navigationType:]中禁止url='about:blank'导航,导致页面内容没有被加载,而显示了空白页。

CDVViewController加载页面经过如下流程:

1、使用Cordova的项目一般是想在Web页面中与原生代码交互,实现某种页面无法实现的功能。页面与原生交互离不开Cordova原生插件,Cordova原生插件的信息配置在一个名为config.xml的配置文件中,当使用CDVViewController加载页面时,都会分析config.xml文件来注册Cordova原生插件,并且并不是所有的页面都可以加载,是有加载策略的,符合策略的才允许加载。

加载页面分析config.xml调用堆栈如下图:(最重要的已标红)

2、CDVIntentAndNavigationFilter有三个重要的方法,如下图所示:

- (void)parserDidStartDocument:(NSXMLParser *)parser 在文档开始分析时调用,开始分析时,初始化数组类型的allowNavigations属性,允许file、http、https、ftp、ftps 以及xxxxxschemes 几种scheme导航,同时初始化数组类型的allowIntents属性。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(nullable NSString *)namespaceURI qualifiedName:(nullable NSString *)qName attributes:(NSDictionary<NSString *, NSString *> *)attributeDict 在xml元素解析时调用, 解析config.xml中的allow-navigation元素以及allow-intent元素,并将解析的内容分别添加到allowNavigations属性以及allowIntents属性中。

- (void)parserDidEndDocument:(NSXMLParser *)parser 在文档分析结束时调用,通过allowNavigations属性以及allowIntents属性创建了两个白名单

3、得到两个白名单之后,开始执行导航策略

 

4、通过loadHTMLString: baseURL: 加载html时,NSURL被设置为about:blank, 这个地址的scheme不在任何一个白名单列表中,因此被拒绝导航。可以在config.xml增加一个白名单,允许about:blank导航即可。

posted @ 2021-12-21 15:13  陆斯恩  阅读(853)  评论(0)    收藏  举报