[![Circle CI](https://circleci.com/gh/ionic-team/ionic-native.svg?style=shield)](https://circleci.com/gh/ionic-team/ionic-native) [![Commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/) ![](https://img.shields.io/npm/v/@ionic-native/core.svg) # Ionic Native Ionic Native is a curated set of wrappers for Cordova plugins that make adding any native functionality you need to your [Ionic](https://ionicframework.com/) mobile app easy. Ionic Native wraps plugin callbacks in a Promise or Observable, providing a common interface for all plugins and making it easy to use plugins with Angular change detection. ## Installation Run following command to install Ionic Native in your project. ```bash npm install @ionic-native/core@beta --save ``` You also need to install the Ionic Native package for each plugin you want to add. Please see the [Ionic Native documentation](https://ionicframework.com/docs/native/) for complete instructions on how to add and use the plugins. **NOTE: to use Ionic Native v5, you must use the `@beta` tag when installing any NPM package.** ## Documentation For the full Ionic Native documentation, please visit [https://ionicframework.com/docs/native/](https://ionicframework.com/docs/native/). ### Basic Usage #### Ionic/Angular apps To use a plugin, import and add the plugin provider to your `@NgModule`, and then inject it where you wish to use it. Make sure to import the injectable class from the `/ngx` directory as shown in the following examples: ```typescript // app.module.ts import { Camera } from '@ionic-native/camera/ngx'; ... @NgModule({ ... providers: [ ... Camera ... ] ... }) export class AppModule { } ``` ```typescript import { Geolocation } from '@ionic-native/geolocation/ngx'; import { Platform } from 'ionic-angular'; @Component({ ... }) export class MyComponent { constructor(private geolocation: Geolocation, private platform: Platform) { this.platform.ready().then(() => { // get position this.geolocation.getCurrentPosition().then(pos => { console.log(`lat: ${pos.coords.latitude}, lon: ${pos.coords.longitude}`) }); // watch position const watch = geolocation.watchPosition().subscribe(pos => { console.log(`lat: ${pos.coords.latitude}, lon: ${pos.coords.longitude}`) }); // to stop watching watch.unsubscribe(); }); } } ``` #### ES2015+/TypeScript These modules can work in any ES2015+/TypeScript app (including Angular/Ionic apps). To use any plugin, import the class from the appropriate package, and use it's static methods. ```js import { Camera } from '@ionic-native/camera'; document.addEventListener('deviceready', () => { Camera.getPicture() .then((data) => console.log('Took a picture!', data)) .catch((e) => console.log('Error occurred while taking a picture', e)); }); ``` #### AngularJS Ionic Native generates an AngularJS module in runtime and prepares a service for each plugin. To use the plugins in your AngularJS app: 1. Download the latest bundle from the [Github releases](https://github.com/ionic-team/ionic-native/releases) page. 2. Include it in `index.html` before your app's code. 3. Inject `ionic.native` module in your app. 4. Inject any plugin you would like to use with a `$cordova` prefix. ```js angular.module('myApp', ['ionic.native']) .controller('MyPageController', function($cordovaCamera) { $cordovaCamera.getPicture() .then( function(data) { console.log('Took a picture!', data); }, function(err) { console.log('Error occurred while taking a picture', err); } ); }); ``` #### Vanilla JS To use Ionic Native in any other setup: 1. Download the latest bundle from the [Github releases](https://github.com/ionic-team/ionic-native/releases) page. 2. Include it in `index.html` before your app's code. 3. Access any plugin using the global `IonicNative` variable. ```js document.addEventListener('deviceready', function() { IonicNative.Camera.getPicture() .then( function(data) { console.log('Took a picture!', data); }, function(err) { console.log('Error occurred while taking a picture', err); } ); }); ``` ### Mocking and Browser Development (Ionic/Angular apps only) Ionic Native makes it possible to mock plugins and develop nearly the entirety of your app in the browser or in `ionic serve`. To do this, you need to provide a mock implementation of the plugins you wish to use. Here's an example of mocking the `Camera` plugin to return a stock image while in development: First import the `Camera` class in your `src/app/app.module.ts` file: ```typescript import { Camera } from '@ionic-native/camera/ngx'; ``` Then create a new class that extends the `Camera` class with a mock implementation: ```typescript class CameraMock extends Camera { getPicture(options) { return new Promise((resolve, reject) => { resolve('BASE_64_ENCODED_DATA_GOES_HERE'); }); } } ``` Finally, override the previous `Camera` class in your `providers` for this module: ```typescript providers: [{ provide: Camera, useClass: CameraMock }]; ``` Here's the full example: ```typescript import { ErrorHandler, NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { IonicApp, IonicModule, IonicErrorHandler } from 'ionic-angular'; import { MyApp } from './app.component'; import { HomePage } from '../pages/home/home'; import { Camera } from '@ionic-native/camera/ngx'; import { HomePage } from '../pages/home/home'; import { MyApp } from './app.component'; class CameraMock extends Camera { getPicture(options) { return new Promise((resolve, reject) => { resolve('BASE_64_ENCODED_DATA_GOES_HERE'); }); } } @NgModule({ declarations: [MyApp, HomePage], imports: [BrowserModule, IonicModule.forRoot(MyApp)], bootstrap: [IonicApp], entryComponents: [MyApp, HomePage], providers: [ { provide: ErrorHandler, useClass: IonicErrorHandler }, { provide: Camera, useClass: CameraMock } ] }) export class AppModule {} ``` ### Runtime Diagnostics Spent way too long diagnosing an issue only to realize a plugin wasn't firing or installed? Ionic Native lets you know what the issue is and how you can resolve it. ![img](https://ionic-io-assets.s3.amazonaws.com/ionic-native-console.png) ## Plugin Missing? Let us know or submit a PR! Take a look at [the Developer Guide](https://github.com/ionic-team/ionic-native/blob/master/DEVELOPER.md) for more on how to contribute. :heart: # Credits Ibby Hadeed - [@ihadeed](https://github.com/ihadeed) Daniel Sogl - [@sogldaniel](https://twitter.com/sogldaniel) Tim Lancina - [@timlancina](https://twitter.com/timlancina) Mike Hartington - [@mhartington](https://twitter.com/mhartington) Max Lynch - [@maxlynch](https://twitter.com/maxlynch) Rob Wormald - [@robwormald](https://twitter.com/robwormald)