HBuilder OC向JS传参

这次又是插件开发..需要自定义一个录像机,录完视频后把视频压缩保存本地,并进行base64编码传给JS。

JS调用OC


HBuilder给的文档有详细说明怎么配置插件,我之前的一篇文章也有介绍,这就不在一一赘述了,接下来要说的是开发过程中遇到的一些问题和最终的解决方案,希望对有需要的人有所帮助,也是给自己的一种记录。

首先说下JS端打开iOS原生的viewController,以前一直认为不能代开原生页面,感觉像是打开另一个App一样..最后发现其实他也属于混合开发,下面是弹出视图的方法,把此方法写入插件方法内

CameraVC* camera = [[CameraVC alloc] init];
//这里一定要用 self.rootViewController,使其变为跟视图,并且要用模态弹出的方式来弹出视图        
[self.rootViewController presentViewController:camera animated:YES completion:nil];

这样就实现了通过JS来打开iOS原生页面

OC调用JS


开发中遇到的另一个问题就是OC向JS传值的问题了,官网只给出了 JavaScript 调用 native 代码的接口,对于 native 调用 JavaScript 并且向 JavaScript 发送 event 事件的方法却在 native层 进行了封装

OC向JS传值的方法大体上都是

stringByEvaluatingJavaScriptFromString

这个方法,那就开始找吧..

最后发现,在inc中的PDRCoreAppFrame.h中,有这个方法:

/**
 @brief 在当前页面同步执行Javascript
 @param js javasrcipt 脚本
 @return NSString* 执行结果
 */
- (NSString*)stringByEvaluatingJavaScriptFromString:(NSString*)js;
获取PDRCoreAppFrame对象

其中 PDRCoreAppFrame 为控制 webView 的实例,数量可能为多个,且在视图层级中的位置不确定,故需要通过遍历 app 中所有 view ,来找到PDRCoreAppFrame:

- (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;
}
调用JS

-(void)evaluatingJavaScriptFromString:(NSString*)string{

    UIWindow *window = [[UIApplication sharedApplication] keyWindow];

    NSArray *views = [[[window rootViewController] view] subviews];
    
    NSArray *frames = [self searchViews:views];
    
    NSLog(@"views == %@",frames);
    
    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];
            
        });
    }
}
向JS发送event
(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];
    }
    //调用上述方法
    [self evaluatingJavaScriptFromString:evalStr];
}

最后通过调用

[self fireEvent:@"event_name" args:args];

向JS发送event

js接收event并处理

接收上一步发送的"event_name"事件,js进行捕获

//接收OC传来的参数
document.addEventListener("event_name", eventFunc, false); 
    function eventFunc(args) {
        alert(JSON.parse(args.arguments));
    };

这样就可以接收到OC传来的参数了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容