公孙离
公孙离
  • 发布:2019-06-28 09:31
  • 更新:2019-06-28 09:31
  • 阅读:1908

基于HBuilder iOS离线打包 oc和js互调

分类:HTML5+

本篇文章基于HBuilder iOS离线打包widget方式 oc和js 互调 ps:如果不是离线打包方式代码仅供参考

原理:js调用oc用的是H5+封装好的api,oc调用js 并不是真正的调用js方法,而是注册自定义监听事件,通过监听的方式获取oc传到js里的参数,从而达到oc调用js

js调用原生oc方法

  • js调用oc类方法

    //LoginViewController是oc类 txt是要传的参数  
    plus.ios.importClass("LoginViewController").login("txt“);
  • js调用oc对象方法

    //objectToJsonImage是oc对象方法  massageArray返回值  
    var Massage = plus.ios.importClass("LoginViewController");  
    var massage = new Massage();  
    var massageArray = massage.objectToJsonImage();
  • js调用oc方法可以后的oc的返回值

oc 调用js

  • oc调用js 比较复杂 看代码吧

    (NSMutableArray*)searchViews:(NSArray*)views{  
    
    NSMutableArray *frames = [NSMutableArray array];  
    //遍历view  
    for (UIView *temp in views) {  
    
        if ([temp isMemberOfClass:[PDRCoreAppFrame class]]) {  
    
            [frames addObject:temp];  
        }  
        if ([temp subviews]) {  
    
            NSMutableArray *tempArray = [self searchViews:[temp subviews]];  
    
            for (UIView *tempView in tempArray) {  
    
                if ([tempView isMemberOfClass:[PDRCoreAppFrame class]]) {  
    
                    [frames addObject:tempView];  
                }  
            }  
        }  
    }  
    //返回值 frames 为从该层级中找到的 PDRCoreAppFrame  
    return frames;  
    }  
    (void)evaluatingJavaScriptFromString:(NSString*)string{  
    
    UIWindow *window = [[UIApplication sharedApplication] keyWindow];  
    
    NSArray *views = [[[window rootViewController] view] subviews];  
    
    NSArray *frames = [self searchViews:views];  
    
    for (PDRCoreAppFrame *appFrame in frames) {  
        /*这里需要注意执行异步任务,在block内需要回到主线程来进行JS event的调用,但是如果还是使用  
         dispath_get_main_queue的话会造成调用JS有alert的话线程会死锁,具体原因也不是特别清晰,  
         在stackOverFlow中看到应该是JS和OC不同alert线程的原因  
         */  
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
            [appFrame performSelectorOnMainThread:@selector(stringByEvaluatingJavaScriptFromString:) withObject:string waitUntilDone:NO];  
    
        });  
    }  
    }  
    (void)fireEvent:(NSString*)event args:(NSString *)args{  
    NSString *evalStr = nil;  
    
    if (args) {  
        //创建js事件  
        evalStr = [NSString stringWithFormat:@"\  
                   var pathEvent = document.createEvent('HTMLEvents');\  
                   pathEvent.initEvent('%@', true, true);\  
                   pathEvent.eventType = 'message';\  
                   pathEvent.arguments = '%@';\  
                   document.dispatchEvent(pathEvent);",event,args];  
    }else{  
        evalStr = [NSString stringWithFormat:@"\  
                   var pathEvent = document.createEvent('HTMLEvents');\  
                   pathEvent.initEvent('%@', true, true);\  
                   pathEvent.eventType = 'message';\  
                   document.dispatchEvent(pathEvent);",event];  
    }  
    //return evalStr;  
    //调用上述方法  
    [self evaluatingJavaScriptFromString:evalStr];  
    }  
    //通过此代码调用  
    [self fireEvent:@"event_name" args:@"json"];  
    //js端代码  
    document.addEventListener('event_name', function(e) {  
        alert(e.arguments);  
    }, false);
1 关注 分享
4***@qq.com

要回复文章请先登录注册