第三节:ionic探索之路-ionic-native插件使用,调试

Ionic插件使用

首先知道cordova,Ionic Native的关系

我们在Cordova plugin上面可以看到,Cordova所编写的插件前端都是js代码,而目前的ionic使用的是ts代码,所以勒就使用了ionic native咯。Ionic Native是Cordova / PhoneGap插件的一个TypeScript包装器,可以给Ionic App轻松添加所需的任何本机功能。
如下图是Cordova Camera插件,里面详细介绍了API,使用方法等等。

cordova.png

但是很遗憾:在ionic3中并不能直接只是安装该插件就可以使用。

但是别担心,Ionic Native就可以轻松的搞定它了。

插件安装,移除,查询插件

添加插件
cordova plugin add 插件名称

移除插件
cordova plugin remove 插件名称

查询当前项目有哪些插件
ionic plugin list

安装ionic native

npm install @ionic-native/对应插件名称 --save
例如:carema插件
cordova plugin add cordova-plugin-carema
 npm install @ionic-native/carema --save
--save作用:会将该native插件的内容写入package.json文件中,在多人协同开发的时候别人就可以直接npm install 就可以直接安装了。
还值得注意的是:
  如果单纯的使用cordova plugin add ...安装了插件的话是不能引用到的,因为ts不能引用到js哦。
解决方式是:添加一个xx.d.ts文件即可。
还需要注意:
  cordove plugin add ... 安装的文件会在项目的plugins文件夹下
  npm install @ionic-native/xx --save会在node_module目录中的@ionic-native目录下

使用

经过了如上的安装Carema插件就已经是可以使用了,根据ionic Native的API介绍,我们需要将插件引入app.module.ts文件的providers中。

image.png
1.app.module.ts文件

import { NgModule, ErrorHandler } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular';
import { MyApp } from './app.component';


import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import {Camera} from "@ionic-native/camera";

@NgModule({
  declarations: [
    MyApp,
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
  ],
  providers: [
    StatusBar,
    // 添加插件
    Camera,
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler}
  ]
})
export class AppModule {}

2. home.ts使用文件

import {Component} from "@angular/core";
import {IonicPage, NavController} from "ionic-angular";
import {Camera, CameraOptions} from "@ionic-native/camera";

@IonicPage()
@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  constructor(public navCtrl: NavController, private camera: Camera) {

  }


  /**
   * 使用Carema插件
   */
  getPic() {
    const options: CameraOptions = {
      quality: 100,
      destinationType: this.camera.DestinationType.DATA_URL,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE
    }

    this.camera.getPicture(options).then((imageData) => {
      // imageData is either a base64 encoded string or a file URI
      // If it's base64:
      let base64Image = 'data:image/jpeg;base64,' + imageData;
      console.log(base64Image)
    }, (err) => {
      // Handle error
    });
  }

}


演示过程

调用该相机的插件之后会有警告,原因为需要真机调试,不能再浏览器调试。


image.png

ionic3带来的调试福音

在以前,在浏览器中测试native功能是一件不可能的事情,需要ionic 混合开发开发人员在真机或模拟器上进行调试,搞过开发的人都知道这是一个要逼疯人的过程,哈哈。
但是:
Ionic Native 3.0现在允许开发人员通过简单的重写机制来仿制和使用浏览器中的native插件,从而可以方便地从传感器提供测试数据,或者访问纯native API(如HealthKit)。这意味着绝大多数的Ionic App现在可以完全在浏览器中构建,而无需部署到真机或模拟器。

下面就试试:

  1. 写一个自定义类,继承Camera,并且重写getPicture方法
import {Camera} from "@ionic-native/camera";
import {Option} from "ionic-angular";
/**
 * Created by 雷洪飞 on 2017/9/26.
 * @function: 仿制Carema插件,在浏览器上调试
 */

export class CameraMock extends Camera{
  // base64图片编码,后面部分被省略了的,因为太TM多了。
  fakeImage:string = 'data:image/png;base64,iVBOu';

  /**
   * 重写了getPicture方法
   * @param options 参数
   * @returns {Promise<T>} 返回值
   */
  getPicture(options:Option){
    return new Promise((resolve, reject) => {
      resolve(this.fakeImage);
    })
  }
}

  1. 在app.module.ts中的providers中,使用userClass来覆盖Camera的provider
import {ErrorHandler, NgModule} from "@angular/core";
import {BrowserModule} from "@angular/platform-browser";
import {IonicApp, IonicErrorHandler, IonicModule} from "ionic-angular";
import {MyApp} from "./app.component";


import {StatusBar} from "@ionic-native/status-bar";
import {SplashScreen} from "@ionic-native/splash-screen";
import {Camera} from "@ionic-native/camera";
import {CameraMock} from "../pages/home/camera.mock";


@NgModule({
  declarations: [
    MyApp,
  ],
  imports: [
    BrowserModule,
    IonicModule.forRoot(MyApp)
  ],
  bootstrap: [IonicApp],
  entryComponents: [
    MyApp,
  ],
  providers: [
    StatusBar,
    {
      // 这里覆盖了Camera
      provide: Camera, useClass: CameraMock
    },
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler}
  ]
})
export class AppModule {
}

3.基本完事,这就干,直接上调试图片,然后再解释一遍思路,肯定有基础的小伙伴都是明白了的。

没有仿制插件时的截图

image.png

仿制了的图片截图

image.png

明显就看到了拿到了base64编码哦,这样说明调试成功了,都不要去真机上调试了。开心吧。在真机上使用也是拿到这个数据而已。
还需要解释的是图片上为什么多了一个base64的头:是因为我们在调用的时候自己多加了一个头而已。


  /**
   * 使用Carema插件
   */
  getPic() {
    const options: CameraOptions = {
      quality: 100,
      destinationType: this.camera.DestinationType.DATA_URL,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE
    }

    this.camera.getPicture(options).then((imageData) => {
      // imageData is either a base64 encoded string or a file URI
      // If it's base64:
      let base64Image = 'data:image/jpeg;base64,' + imageData;
      console.log(base64Image)
    }, (err) => {
      // Handle error
    });
  }

将bas64拿去转图片是完全成功的哦。

思路解释:

仿制插件的原因不在多说,就是方便调试
仿制为什么成功:
利用了继承的思想,别问我什么是继承,什么是重写。这是Java的思想,现在被TypeScript也使用哦。很多高级语言都有了,如C++呀这些的。

那么重写了getPicture方法之后勒,使用getPicture的时候就会被调用到这里。但是要注意的是我们使用的是Camera,并不是自己写的类啊,这就要归功于Angular了,因为在app.module.ts中我们改了providers的哦,使用了useClass来引用了我们自己写的类。

在自定义的provider里,可以提供自定义数据来做快速调试。比如说:
使用HTTP.get方法,返回测试的json串,用来解析赋值给前端控件
让BarcodeScanner.scan()返回测试的二维码数据
用BluetoothSerial实现一个模拟链接和数据传输系统
重写TouchID或者AndroidFingerprintAuth来实现iOS或者Android系统的指纹扫描识别

等到不用的时候,只要把app.module.ts中providers的那句代码删掉就可以了。

// 代码如下:
  providers: [
    StatusBar,
    {
      // 这里覆盖了Camera
      provide: Camera, useClass: CameraMock
    },
    SplashScreen,
    {provide: ErrorHandler, useClass: IonicErrorHandler}
  ]
这样使用Camera就是在使用CameraMock

使用第三方插件

使用第三方插件的话,是没有ionic Native这个东西的,但是它一般都会提供一个xx.d.ts文件,这样就可以是ts结合使用了。

结束

到此插件的简单讲解就结束了哦。
算了还是把代码放到git吧
https://github.com/leihfei/ionic3-plugin.git

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

推荐阅读更多精彩内容

  • ionic是一个运行在webview上的应用,但是很多功能js搞不定,免不了本地代码的支持。ionic在nativ...
    李泽1988阅读 3,015评论 0 3
  • 官网地址:http://ionicframework.com/docs/native/里面都有自己的详细文档,写这...
    lhl_012阅读 854评论 0 1
  • ionic2官方提供了很多原生插件,是建立在cordova plugin基础上,结合ionic-native的ts...
    charles0427阅读 2,518评论 0 4
  • 本文前提认为读者有基本的angular2基础,知道怎么import,知道provider怎么用 有人问到视频上传这...
    IT晴天阅读 3,599评论 14 7
  • 蝴蝶天使 我是折翼的天使, 借来蝶的翅膀, 从堕落中苏醒。 沾染了这尘世的气息, 却回不了天堂。 眷恋于絪缊的林间...
    CZP_阅读 508评论 0 2