日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

[Cordova]JS和Native交互实现关键代码(iOS)

發(fā)布時(shí)間:2024/7/23 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Cordova]JS和Native交互实现关键代码(iOS) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、JS中定義的exec函數(shù):define("cordova/exec", function(require, exports, module) 。關(guān)鍵實(shí)現(xiàn)代碼如下:
1.建立command對(duì)象,并且將命令推入commandQueuevar command = [callbackId, service, action, actionArgs];commandQueue.push(JSON.stringify(command));
2.建立不可見(jiàn)的iframe,并且在后續(xù)會(huì)將此iframe添加的頁(yè)面function createExecIframe() {? ? var iframe = document.createElement("iframe");? ? iframe.style.display = 'none';? ? document.body.appendChild(iframe);? ? return iframe;}
3.將iframe的鏈接設(shè)置為“gap://ready”,此時(shí)網(wǎng)頁(yè)端會(huì)發(fā)送一個(gè)請(qǐng)求execIframe = execIframe || createExecIframe();execIframe.src = "gap://ready";
二、UIWebView中攔截請(qǐng)求
1.CDVViewController中,實(shí)現(xiàn)了webview的代理方法:- (BOOL)webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
2.當(dāng)網(wǎng)頁(yè)端發(fā)起iframe中的請(qǐng)求時(shí),請(qǐng)求會(huì)被此方法攔截:if ([[url scheme] isEqualToString:@"gap"]) {? ? [_commandQueue fetchCommandsFromJs];? ? return NO;}當(dāng)發(fā)現(xiàn)網(wǎng)頁(yè)鏈接是gap協(xié)議的,此時(shí)通過(guò)fetchCommandsFromJs方法獲取命令對(duì)象并執(zhí)行,并且返回NO。實(shí)現(xiàn)的效果:既攔截了命令,而且頁(yè)面不做變化。
2.fetchCommandsFromJs實(shí)現(xiàn)
(1)通過(guò)執(zhí)行js腳本,獲取網(wǎng)頁(yè)端js對(duì)象commandQueue中的命令(轉(zhuǎn)換為Json的字符串格式,包含服務(wù)名,方法名,以及參數(shù)列表)NSString* queuedCommandsJSON = [_viewController.webView stringByEvaluatingJavaScriptFromString:? ?@"cordova.require('cordova/exec').nativeFetchMessages()"];? ?(2)將json字符串解析,并且合成CDVInvokedUrlCommand對(duì)象NSArray* commandBatch = [queuedCommandsJSON JSONObject];CDVInvokedUrlCommand* command = [[CDVInvokedUrlCommand alloc] initFromJson:commandBatch];
(3)執(zhí)行Command對(duì)象//通過(guò)類名獲取plugin實(shí)例CDVPlugin* obj = [_viewController.commandDelegate getCommandInstance:command.className];//通過(guò)方法名創(chuàng)建方法對(duì)象SEL normalSelector = NSSelectorFromString(methodName);//通過(guò)參數(shù)字符串列表創(chuàng)建參數(shù)列表對(duì)象NSMutableArray* arguments = nil;NSMutableDictionary* dict = nil;[command legacyArguments:&arguments andDict:&dict];//發(fā)送消息objc_msgSend(obj, legacySelector, arguments, dict);
三、Native代碼回調(diào)JS
1.在plugin的功能方法實(shí)現(xiàn)中,我們手動(dòng)調(diào)用如下函數(shù)向js頁(yè)面返回結(jié)果[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
2.在如上方法的實(shí)現(xiàn)中,實(shí)現(xiàn)如下:NSString* js = [NSString stringWithFormat:@"cordova.require('cordova/exec').nativeCallback('%@',%d,%@,%d)", callbackId, status, argumentsAsJSON, keepCallback];[_viewController.webView stringByEvaluatingJavaScriptFromString:js];
四、總結(jié):經(jīng)上面的步驟,一個(gè)完整的交互流程就實(shí)現(xiàn)了。

總結(jié)

以上是生活随笔為你收集整理的[Cordova]JS和Native交互实现关键代码(iOS)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。