Cordova和Html交互

前言

最近幾年混合開(kāi)發(fā)越來(lái)越火,今天想寫(xiě)一個(gè)wkwebview和cordova的交互走贪。

1: 創(chuàng)建第一個(gè)Cordova工程

打開(kāi)終端,cmd切換目錄到工作目錄下谅阿,輸入以下命令,同樣,可能需要點(diǎn)時(shí)間來(lái)完成
cordova create Demo com.cordova.demo.hello HelloWorld
cordova_create_01.png

2: 添加平臺(tái)支持

所有后續(xù)命令在項(xiàng)目的目錄中進(jìn)行纸兔,可在該項(xiàng)目任何子目錄中奈揍,cmd切換到項(xiàng)目目錄下
cd Demo
在構(gòu)建項(xiàng)目之前,你需要指定一組目標(biāo)平臺(tái)话原。你能夠運(yùn)行這些命令取決于您的機(jī)器是否支持每一個(gè)SDK晤揣,合理是否已安裝SDK。在MAC上運(yùn)行命令:
 cordova platform add ios

3: 查看Cordova支持平臺(tái)以及已經(jīng)添加的平臺(tái)

cordova platforms ls
cordova_addios_02.png

4: 添加插件

cordova plugin add cordova-plugin-device

5: 查看插件

cordova plugin list
cordova_addplugin_03.png

6: 添加wkwebview插件

cordova plugin add cordova-plugin-wkwebview-engine

7: 在iOS項(xiàng)目,并使用cocoapods在,podfile文件如下,pod install

platform :ios,'9.0'
inhibit_all_warnings!
target 'WKWebiveCordova' do
   pod 'cordova-plugin-device'
   pod 'cordova-plugin-wkwebview-engine
end
cordova_addpod_04.png

8 :拉入www文件進(jìn)入iOS項(xiàng)目

在(cordova項(xiàng)目)下面兩個(gè)標(biāo)記出來(lái)的文件和文件夾移動(dòng)到(iOS項(xiàng)目)中,注意是(cordova項(xiàng)目)/platforms/ios文件夾下面的被我整理下目錄結(jié)構(gòu)朱灿。拉入ios項(xiàng)目昧识,記得這樣勾選create folder references,才會(huì)變成藍(lán)色文件夾
cordova_set_05.png

9: 查看藍(lán)色文件夾目錄,其中只有platform下的android是安卓那邊的母剥,其他文件夾都是和安卓公用滞诺,等下交互的方法名要一樣。

cordova_addpod_06.png

10: config.xml配置說(shuō)明

<content src="index.html" />
本地的配置的idnex.html环疼,啟動(dòng)wkwebview习霹,如果startPage 沒(méi)有寫(xiě)則是默認(rèn)啟動(dòng)這個(gè)html文件。

加載wkwebview時(shí)候炫隶,要記得載入config.xml文件淋叶,代碼下面會(huì)顯示
跳轉(zhuǎn)url界面能顯示出來(lái)配置如下東西:

<feature name="IntentAndNavigationFilter">
         <param name="ios-package" value="CDVIntentAndNavigationFilter" />
         <param name="onload" value="true" />
 </feature>

 <feature name="CDVWKWebViewEngine">
      <param name="ios-package" value="CDVWKWebViewEngine" />
 </feature>

 <allow-navigation href="http://*/*" />
 <allow-navigation href="https://*/*" />
 <allow-navigation href="*" />
 <preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
 <plugin name="cordova-plugin-wkwebview-engine" spec="^1.2.1" />

11: 新建一個(gè)WKWebview文件繼承CDVViewController 來(lái)顯示加載wkwebview

WKWebview.h文件如下
#import <WebKit/WebKit.h>
#import <UIKit/UIKit.h>
#import <Cordova/CDVViewController.h>
#import <Cordova/CDVCommandDelegateImpl.h>
#import <Cordova/CDVCommandQueue.h>
NS_ASSUME_NONNULL_BEGIN
@interface WKWebview : CDVViewController
+ (WKWebview *)shareInstance;
//設(shè)置這個(gè)值,加載當(dāng)前頁(yè)面
@property (nonatomic, copy) NSString *webUrl;
//當(dāng)前頁(yè)面webview
@property (nonatomic, strong) WKWebView *currentWebView;
@end
NS_ASSUME_NONNULL_END
WKWebview.m文件如下
#import "WKWebview.h"
@interface WKWebview ()
@end

@implementation WKWebview

- (instancetype)init {
    self = [super init];
    if (self) {
        self.configFile   = [self configPath];
    }
    return self;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onNotification:)
    name:CDVPluginResetNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(onNotificationed:)
    name:CDVPageDidLoadNotification object:nil];
     [self setWebViewBackground];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view
    self.currentWebView = (WKWebView *)self.webView;
    self.webView.backgroundColor = [UIColor redColor];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:CDVPluginResetNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:CDVPageDidLoadNotification object:nil];
}

- (NSString *)configPath {
    NSString *path = [[NSBundle mainBundle]pathForResource:@"config" ofType:@"xml"];
    NSLog(@"path===== %@",  path);
    return path;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)onNotification:(NSNotification *)notification {
    NSLog(@"webview開(kāi)始加載");
    WKWebView *webview = notification.object;
    if (![[webview.URL absoluteString] containsString:@"www/error.html"]) {
    }
    if ([webview.URL.absoluteString isEqualToString:@"ios:backtotheroot"]) {
        [self.navigationController popViewControllerAnimated:YES];
    }
}
//wkwebView
- (void)onNotificationed:(NSNotification *)notification {
    NSLog(@"webview加載完成");
    WKWebView *webview = notification.object;
    //去除長(zhǎng)按后出現(xiàn)的文本選取框
    [webview evaluateJavaScript:@"document.documentElement.style.webkitUserSelect='none';" completionHandler:^(id obj, NSError *error){
    }];
    [webview evaluateJavaScript:@"document.title" completionHandler:^(id obj, NSError *error) {
        if ([obj isKindOfClass:[NSString class]]) {
            self.title = (NSString *)obj;
        }
    }];
}

- (void)setWebUrl:(NSString *)webUrl {
    if (!webUrl) {
        return;
    }
    _webUrl = webUrl;
    if (self.currentWebView) {
        NSURL *url = [NSURL URLWithString:[webUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        [self.currentWebView loadRequest:request];
    }
}

- (void)setWebViewBackground {
    NSLog(@"self.startPage==%@", self.startPage);
    if ([self.startPage containsString:@"hsjob"]) {
        self.view.backgroundColor = [UIColor redColor];
    } else if ([self.startPage containsString:@"hstravel"]) {
        self.view.backgroundColor = [UIColor redColor];
    } else if ([self.startPage containsString:@"movie"]) {
        self.view.backgroundColor = [UIColor blackColor];
    }
}
@end

12: 啟動(dòng)遠(yuǎn)程url顯示wkwenview界面調(diào)用

 WKWebview *vc = [[WKWebview alloc] init];
 vc.startPage = @"http://www.baidu.com";
 vc.hidesBottomBarWhenPushed = NO;
 [self.navigationController pushViewController:vc animated:YES];
cordova_start_07.png

13: 把vc.startPage = @"http://www.baidu.com"; 屏蔽掉伪阶,默認(rèn)顯示出index.html煞檩,用來(lái)實(shí)現(xiàn)原聲和html的交互demo

cordova_start_08.png

14: 新建一個(gè)CDVPlugin繼承CDVPlugin 來(lái)作為原聲和html5的橋接調(diào)用

MyPlugi.h文件
#import "CDVPlugin.h"
#import <Cordova/CDVPlugin.h>
NS_ASSUME_NONNULL_BEGIN
@interface MyPlugin : CDVPlugin
// 獲取當(dāng)前位置信息
- (void)currentPosition:(CDVInvokedUrlCommand *)command;
@end
NS_ASSUME_NONNULL_END
MyPlugi.m文件
#import "MyPlugin.h"
@implementation MyPlugin
//獲取當(dāng)前位置信息
- (void)currentPosition:(CDVInvokedUrlCommand *)command {
     NSLog(@"command是回調(diào)的參數(shù),在里面取");
    CDVPluginResult *result2 = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsArray:@[ @"data1", @"data2" ]];
    [self.commandDelegate sendPluginResult:result2 callbackId:command.callbackId];
}
@end

15: 在config.xml文件配置下這個(gè)文件如下

  <feature name="MyPlugin">
      <param name="ios-package" value="MyPlugin" />
  </feature>

16: index.html文件配置如下

      <script type="text/javascript" src="./platform/common/loader.js"></script> // 能并行執(zhí)行js
        <script type="text/javascript">
            var loadList = ["./platform/common/hsplatform.js"];
            var u = navigator.userAgent;
            var isAndroid = u.indexOf("Android") > -1 || u.indexOf("Adr") > -1; //android終端
            var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
            //app內(nèi)部 這里需要判斷加載安卓或者ios的區(qū)別栅贴,我就默認(rèn)為ios了
            if (u.indexOf("_hsApp_") != -1) {
              var cordovaURL = "./platform/ios/cordova.js";
              if (isiOS) {
                cordovaURL = "./platform/ios/cordova.js";
              }
              loadList.push(cordovaURL, "./js/index.js");
            }else{
                var cordovaURL = "./platform/ios/cordova.js";
                if (isiOS) {
                  cordovaURL = "./platform/ios/cordova.js";
                }
                loadList.push(cordovaURL, "./js/index.js");
            }
            Loader.load(loadList);
        </script>

17: 修改下index.js文件

document.addEventListener("deviceready", onDeviceReady, false);

function onDeviceReady() {
    console.log("準(zhǔn)備");
}

// 獲取當(dāng)前位置
Cordova.exec(successCurrentPosition, errorCurrentPosition, "MyPlugin", "currentPosition", [argument]);
/ ***successCurrentPosition 成功回調(diào)
errorCurrentPosition 失敗回調(diào)
MyPlugin 我們新建的文件名字
currentPosition 調(diào)用方法
argument 入?yún)?**/
function currentPosition() {
    console.log("該功能只能在A(yíng)PP內(nèi)部使用");
    var argument = JSON.stringify({
        'relocation': 'false'
    });
    Cordova.exec(successCurrentPosition, errorCurrentPosition, "MyPlugin", "currentPosition", [argument]);
}

//獲取當(dāng)前位置成功回調(diào)
function successCurrentPosition(position) {
    console.log(position);
}
//獲取當(dāng)前位置失敗回調(diào)
function errorCurrentPosition(position) {
    console.log(position);
}

18: 為了index.js能正常打印console.log,在index.html上加上

<script src="https://cdn.bootcss.com/vConsole/3.2.0/vconsole.min.js"></script>
在config.xml配置
<feature name="Console">
    <param name="ios-package" value="CDVLogger" />
    <param name="onload" value="true" />
</feature>

19: 點(diǎn)擊h5界面 實(shí)現(xiàn)使用原生的交互如下斟湃,打印出

2022-07-07 05:05:57.442579+0800 WKWebiveCordova[74344:646107] 該功能只能在A(yíng)PP內(nèi)部使用
2020-07-07 05:05:57.445205+0800 WKWebiveCordova[74344:646107] command是回調(diào)的參數(shù),在里面取
2020-07-07 05:15:08.682174+0800 WKWebiveCordova[74813:651778] error==data1,data2

20: 是否需要回調(diào)到html5 用self.commandDelegate sendPluginResult方法

21: 原生到html5檐薯,從html5到原生的交互就說(shuō)完了凝赛,需要其他的插件交互都可以在這個(gè)www目錄上增加,和MyPlugin文件擴(kuò)展坛缕。demo會(huì)上傳到github上去

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末墓猎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子赚楚,更是在濱河造成了極大的恐慌毙沾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宠页,死亡現(xiàn)場(chǎng)離奇詭異左胞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)举户,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)烤宙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人敛摘,你說(shuō)我怎么就攤上這事∪橛洌” “怎么了兄淫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵屯远,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捕虽,道長(zhǎng)慨丐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任泄私,我火速辦了婚禮房揭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晌端。我一直安慰自己捅暴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布咧纠。 她就那樣靜靜地躺著蓬痒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漆羔。 梳的紋絲不亂的頭發(fā)上梧奢,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音演痒,去河邊找鬼亲轨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鸟顺,可吹牛的內(nèi)容都是我干的惦蚊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诊沪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼养筒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起端姚,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晕粪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后渐裸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體巫湘,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年昏鹃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尚氛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洞渤,死狀恐怖阅嘶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤讯柔,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布抡蛙,位于F島的核電站,受9級(jí)特大地震影響魂迄,放射性物質(zhì)發(fā)生泄漏粗截。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一捣炬、第九天 我趴在偏房一處隱蔽的房頂上張望熊昌。 院中可真熱鬧,春花似錦湿酸、人聲如沸婿屹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)选泻。三九已至,卻和暖如春美莫,著一層夾襖步出監(jiān)牢的瞬間页眯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工厢呵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留窝撵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓襟铭,卻偏偏與公主長(zhǎng)得像碌奉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寒砖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355