关于webview注入js时机的问题

2018-10-17  本文已影响170人  child_cool

最直接的解决办法
webview加载会先去查看该方法是否实现
NSObject添加一个扩展去实现webView:didCreateJavaScriptContext:forFrame:方法

对上面的解决方法优化思路

该方案来源于对听云sdk的反编译代码分析

方案一
#import "JSInjection.h"
#import <objc/runtime.h>
#import <JavaScriptCore/JavaScriptCore.h>

@implementation JSInjection

+ (void)start {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        //JSContext
        Method imageNamedMethod = class_getClassMethod([NSObject class], @selector(webView:didCreateJavaScriptContext:forFrame:));
        
        if (imageNamedMethod == nil) {
            
            class_addMethod([NSObject class], @selector(webView:didCreateJavaScriptContext:forFrame:), class_getMethodImplementation([self class], @selector(test_webView:didCreateJavaScriptContext:forFrame:)),method_getTypeEncoding(imageNamedMethod));
        }
    });
}

- (void)test_webView:(id)unuse didCreateJavaScriptContext:(JSContext *)ctx forFrame:(id)frame
{
    NSLog(@"js注入位置");
}

@end

调用位置

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "JSInjection.h"

int main(int argc, char * argv[]) {
    @autoreleasepool {
        [JSInjection start];
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
方案二
上一篇 下一篇

猜你喜欢

热点阅读