Ionic 2 基础 - 第十二课:本地功能
基于网页的移动应用的问题在于我们可以通过浏览器在iOS和Android上运行,用户不能将它们安装在设备本地,应用不能访问本地API,如:联系人,蓝牙等等。这就是为什么我们使用Cordova结合Ionic,Cordova允许我们将应用打包为一个本地封装,这样允许我你们提交到应用商店,同时也可以通过插件来使用本地API。用来Cordova之后,HTML5移动应用可以做到本地应用能做的一切。
刚才也说到了,想要使用本地功能的话我们就要用到插件。Cordova提供了大量的默认插件包括:
- 设备 Device
- 网络信息 Network Information
- 相机 Camera
- 地理信息 Geolocation
- 文件 File
- 应用内浏览器 In App Browser
- 多媒体 Media
- 启动画面 Splash Screen
同时,基本上所有的功能都有社区开发的开源插件,以下是一些比较流行的:
插件所做的基本上就是创建一个接口给JavaScript触发本地功能的调用。所以,如果你需要用到一个不存在的Cordova插件的时候(基本上不会遇到这样的情况),你可以自己去写(当然也需要写本地代码)。
重要:大部分插件只在真实设备上才可以使用,如果你想通过ionice serve去测试Cordova插件的时候可以能会出现错误。
在Ionic 2中使用Cordova插件
Ionic 2中实现本地功能有两种方法。可以通过安装Cordova插件直接使用:
ionic plugin add plugin-name
然后访问插件提供的本地功能,通常可以通过全局对象去访问:
window.plugins.somePlugin.someMethod();
不需要导入,不需要需求(required),不需要在特定地方调用或者不需要其他任何东西 —— 一旦你通过命令行安装好了插件之后你可以在任何地方访问。并不是所有的插件都可以这样去访问,但是大部分都是这么用的。这不是Ionic 2特有的,任何Cordova项目(唯一的不同是使用cordova plugin add,而不是ionic plugin add)都可以这样去使用。当使用正常Cordova语法的时候,在Ionic 1,Ionic 2,Sencha Touch, jQuery Mobile或者其他使用Cordova的网页里面使用插件并没有不同。
记住如果你这样去使用Cordova插件的话,你的应用可能由于TypeScript警告而编译不了。这是因为TypeScript不知道他是什么,可能你需要去安装他对应的typings。如果想强行通过编译的话,你可以简单的加上:
declare var variableCausingProblems;
在类定义的装饰器上面添加你用到的插件。
另一种方法,你可以用Ionic Native来使用Cordova插件,这是Ionic 2特有的。如果你对Ionic 1的ngCordova很熟悉,这基本就是Ionic 2里面的同一个东西。如果你不熟悉ngCordova的话,Ionic Native基本上就是通过Promise和Observables让Cordova插件更好的与Angular 2工作。
Ionic Native在Ionic 2应用中是默认安装的。所以你需要做的就是像平常那样安装你需要用到的插件,像这样:
ionic plugin add cordova-plugin-geolocation
接下来,你需要在要用到这个插件的类里面通过Ionic Native导入此插件:
import { Geolocation } from 'ionic-native';
然后你就可以在代码里面使用了:
Geolocation.getCurrentPosition().then((resp) => {
console.log("Latitude: ", resp.coords.latitude);
console.log("Longitude: ", resp.coords.longitude);
});
注意,上面代码返回了一个promise,我们通过.then()设置了一个操作器(handler),如果我们使用标准的Cordova语法的话,那么是用不了这个的 — Cordova的标准语法是使用回调函数,会比较乱。
同时需要中哦你大概ianjizhud是不是所有的Cordova插件都能通过Ionic Native使用。所有可用的组件以及如何使用,请查看Ionic Native 文档。如果你想用的组件中Ionic Native里面没有的话,那么你只能回头使用标准Cordova语法了(或者你可以自己动手添加到Ionic Native)。
虽然不是强制要求,你可以在任何地方使用Ionic Native。他可能使你的代码更整洁,更是个Angular 2生态系统(typings自动处理这些,所以TypeScript不会抱怨)。用老式的Cordova不会死人,所以也不要觉得他太糟糕。