做了一段時(shí)間RN
先說RN中方法調(diào)用原理
目前沒碰上原生帶callback調(diào)用js,只有js帶callback調(diào)用原生
- 原生和js端各自持有一份list,js持有原生注冊過的模塊和方法信息愕难,還有一份callback列表常柄,當(dāng)js 調(diào)用call(moduleId, methodId, params, callbackId(這個(gè)cb保存在callbacklist)),會將 這次調(diào)用存在一個(gè)隊(duì)列中(不是正真意義上的主動調(diào)用),待原生的事件驅(qū)動時(shí)會讀取隊(duì)列然后從持有的模塊和方法列表中找到對應(yīng)的 RCT_EXPORTMODULE和RCT_EXPORTMETHOD通過runtime生成對應(yīng)的類和方法執(zhí)行刻坊,至于callback執(zhí)行后會在js的callback列表中根據(jù)id查找對應(yīng)的callback執(zhí)行痹换。
2.native調(diào)用js,底層是通過jsbridge持有jsContentRef向js發(fā)送消息藏澳,在RN 中js通過監(jiān)聽事件的方式來捕捉native的調(diào)用事件
hybrid 框架,h5與native交互
h5調(diào)用native通過代碼注入和URL_SCHEMA(有長度限制)
1.代碼注入
iOS端使用wkwebview時(shí)耀找,獲取到j(luò)scontent然后通過[jscontent addScriptMessageHandler:self name:@"nativeBridge"]掛載一個(gè)“nativeBridge”翔悠,H5通過window.webkit.messageHandlers.nativeBridge.postMessage(message); 發(fā)送消息。其中callback執(zhí)行原理是在js端保存callbacid原生執(zhí)行完后將返回值和id回傳給js找到對應(yīng)id的callback執(zhí)行
- URL_SCHEMA
通過攔截iframe.src解析其中的protocal和host以及param再調(diào)用native自身方法
native調(diào)用h5
result = [uiWebview stringByEvaluatingJavaScriptFromString:javaScriptString];
當(dāng)使用wkwebview時(shí)[wkWebView evaluateJavaScript:javaScriptString completionHandler:completionHandler];