UIWebView新的URL注入JSContext对象时机问题

H5一般分为单页应用和多页面应用

H5单页面

在H5单页面中注入JSContext可在UIWebViewDelegate- (void)webViewDidStartLoad:(UIWebView *)webView注入即可。由于是单页面一般是通过Hash等方法来跳转,故只需要注入一次即可。

H5多页面

此时在H5单页面注入的方法已经不能正常使用了,如果使用上面的方法,第一次加载一般正常,跳转之后页面注入的对象就不能正常使用了,究其原因主要是JSContext对象注入的时机不对,开始加载时,通过documentView.webView.mainFrame.javaScriptContext并不正确。要解决JSContext注入时机的问题,可考虑页面的性质:

  • 如果页面是加载完成之后,用户输入才触发的交互。可以考虑在可在UIWebViewDelegate- (void)webViewDidFinishLoad:(UIWebView *)webView注入即可。
  • 如果是页面加载过程中就需要注入的对象。有如下方法,请参考:
    JSContext重定向问题
    这里提供一种更简洁易懂的方法,自定义UIWebView的方法,代码如下:

NavtiveWeb为实现了JSExport协议的方法,以提供JS和Navtive之间的交互
BaseWebVIew.m文件如下:

#import "BaseWebView.h"
#import 
#import "NavtiveWeb.h"
@implementation BaseWebView
- (void)webView:(id)webView didFirstLayoutInFrame:(id)webFrame {
       [self doInject];
}
- (void)doInject {
JSContext *ctx = [self valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
JSValue *value = ctx.globalObject;
NavtiveWeb *navtiveWeb = [[NavtiveWeb alloc] init];
value[@"navtiveWeb"] = navtiveWeb;
}
@end

以上通过自定义UIWebView复写UIWebView的方法达到在合适的时机注入JS对象。在H5单页和多页应用下使用都没有问题。

你可能感兴趣的:(UIWebView新的URL注入JSContext对象时机问题)