美文网首页
iOS【动态修改第三方类方法】

iOS【动态修改第三方类方法】

作者: NJ_墨 | 来源:发表于2018-02-25 21:38 被阅读29次
#import "WKWebViewJavascriptBridge+ReplaceMethod.h"

@implementation WKWebViewJavascriptBridge (ReplaceMethod)

- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    
    
    WKWebView *tempWeb;
    id<WKNavigationDelegate> _tempWebViewDelegate;
    WebViewJavascriptBridgeBase *_tempBase;
    
    unsigned int count = 0;
    Ivar *ivar = class_copyIvarList([self class], &count);
    for (int i = 0; i<count; i++) {
        Ivar var = ivar[i];
        const char *varName = ivar_getName(var);
        NSString *proname = [NSString stringWithUTF8String:varName];
        
//        NSLog(@"-----web:   %@",proname);
//        const char * name = ivar_getName(var);
//        const char * type = ivar_getTypeEncoding(var);
//        NSLog(@"-----web 类型为 %s 的 %s ",type, name);
        
        
        if ([proname isEqualToString:@"_webView"]) {
            tempWeb = object_getIvar(self, var);
        } else if([proname isEqualToString:@"_webViewDelegate"]) {
            _tempWebViewDelegate = object_getIvar(self, var);
        } else if([proname isEqualToString:@"_base"]) {
            _tempBase = object_getIvar(self, var);
        }
        
    }

    if(tempWeb != webView && tempWeb) {
        return;
    }
    
    NSURL *url = navigationAction.request.URL;
    __strong typeof(_tempWebViewDelegate) strongDelegate = _tempWebViewDelegate;
    
    if ([_tempBase isCorrectProcotocolScheme:url]) {
        
        if ([_tempBase isCorrectProcotocolScheme:url]) {
            if ([_tempBase isBridgeLoadedURL:url]) {
                [_tempBase injectJavascriptFile];
            } else if ([_tempBase isQueueMessageURL:url]) {
                
                if (class_respondsToSelector([self class],@selector(WKFlushMessageQueue))) {
                    [self performSelector:@selector(WKFlushMessageQueue)];
                }
            } else {
                [_tempBase logUnkownMessage:url];
            }
            decisionHandler(WKNavigationActionPolicyCancel);
            
            return;//添加此句解决三方库里的崩溃
        }
    }
    
    if (strongDelegate && [strongDelegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)]) {
        [_tempWebViewDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];
    } else {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
    
}
@end

相关文章

  • iOS动态调用类方法

    iOS动态调用类方法(不带参数) iOS动态调用类方法(带参数) iOS动态调用类方法(有返回值) 优点 弱化连接...

  • iOS【动态修改第三方类方法】

  • iOS RunTime 理解

    可以遍历对象的属性 可以动态的添加、修改属性,动态添加、修改、替换方法,动态添加、修改、替换协议 可以动态创建类、...

  • runtime常见问题

    1 . iOS runtime 运行时,动态添加属性方法首先, 要明白为什么要动态给类添加方法? 如果一个类方法很...

  • runtime相关

    修改系统方法 动态添加方法 动态给系统类添加属性(给分类添加属性) runtime+kvc 转换模型

  • KVO内部实现原理

    动态创建一个子类,注册 修改被观察者的类型,修改isa指针 添加set方法 动态绑定属性 使用 类:方法调用 对象...

  • ios runtime

    什么是runtime runtime运用 在程序运行过程中,动态的创建类,动态添加、修改这个类的属性和方法 遍历一...

  • runtime应用

    1. 概述 能动态产生一个类,一个成员变量,一个方法 能动态修改一个类,一个成员变量,一个方法 能动态删除一个类,...

  • iOS:Category

    目录一,作用二,本质三,同名方法调用原理 一,作用 1,给系统类或第三方类添加属性 因为无法修改系统类或第三方类的...

  • Runtime的定义

    runtime基本作用 在程序运行过程中,动态的创建类,动态添加、修改这个类的方法和属性 遍历一个类的所有成员变量...

网友评论

      本文标题:iOS【动态修改第三方类方法】

      本文链接:https://www.haomeiwen.com/subject/wykdxftx.html