blob: 0f0b49fab8e1ccf044882004b2f158c6e091f065 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="format-detection" content="telephone=no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" />
<meta name="description" content=" ">
<title>
Plugin Development Guide - Apache Cordova
</title>
<link rel="SHORTCUT ICON" href="/favicon.ico"/>
<link rel="canonical" href="https://cordova.apache.org/docs/en/2.7.0/guide/plugin-development/">
<!-- CSS -->
<link rel="stylesheet" type="text/css" href="/static/css/main.css">
<link rel="stylesheet" type="text/css" href="/static/css/lib/syntax.css">
<!-- Fonts -->
<!-- For attribution information, see www/attributions.html -->
<link href='https://fonts.googleapis.com/css?family=Raleway:700,400,300,700italic,400italic,300italic' rel='stylesheet' type='text/css'>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<script type="text/javascript">
var disqus_developer = 1; // this would set it to developer mode
</script>
<!-- JS -->
<script defer type="text/javascript" src="/static/js/lib/jquery-2.1.1.min.js"></script>
<script defer type="text/javascript" src="/static/js/lib/bootstrap.min.js"></script>
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '16']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head>
<body>
<header>
<a class="scroll-point pt-top" name="top"></a>
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/"><img id="logo_top" src="/static/img/cordova-logo-newbrand.svg"/></a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<div class="nav_bar_center">
<ul class="nav navbar-nav">
<li class="active">
<a href="/docs/en/latest/">Documentation</a>
</li>
<li >
<a href="/plugins">Plugins</a>
</li>
<li >
<a href="/blog" id="blog_button">Blog<span class="badge" id="new_blog_count"></span></a>
</li>
<li >
<a href="/contribute">Contribute</a>
</li>
<li >
<a href="/contribute/team.html">Team</a>
</li>
<li>
<a href="/#getstarted">Get Started</a>
</li>
<li>
<form class="navbar-form navbar-right" id="header-search-form" role="search">
<div class="input-group">
</div>
</form>
</li>
</ul>
</div>
</div><!--/.navbar-collapse -->
</div>
</nav>
<div id="_fixed_navbar_spacer" style="padding-top:50px"></div>
</header>
<div class="docs">
<!-- Table of Contents -->
<div class="hidden-xs hidden-sm site-toc-container">
<ul class="site-toc">
<li>
<a class="" href="/docs/en/2.7.0/">
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/accelerometer/accelerometer.html">
Accelerometer
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/camera/camera.html">
Camera
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/media/capture/capture.html">
Capture
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/compass/compass.html">
Compass
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/connection/connection.html">
Connection
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/contacts/contacts.html">
Contacts
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/device/device.html">
Device
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/events/events.html">
Events
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/file/file.html">
File
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/geolocation/geolocation.html">
Geolocation
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/globalization/globalization.html">
Globalization
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/inappbrowser/inappbrowser.html">
InAppBrowser
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/media/media.html">
Media
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/notification/notification.html">
Notification
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/splashscreen/splashscreen.html">
Splashscreen
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/storage/storage.html">
Storage
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/getting-started/index.html">
Getting Started Guides
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/command-line/index.html">
Command-Line Usage
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/upgrading/index.html">
Upgrading Guides
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/project-settings/index.html">
Project Settings
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/plugin-development/index.html">
Plugin Development Guide
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/whitelist/index.html">
Domain Whitelist Guide
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/cordova-webview/index.html">
Embedding WebView
</a>
</li>
</ul>
</div>
<!-- Page content -->
<div class="page-content-container">
<div class="page-content">
<div class="content-header">
<!-- ToC Dropdown (for XS and SM sizes only) -->
<div class="toc-dropdown dropdown visible-xs-block visible-sm-block">
<button class="btn btn-default dropdown-toggle" type="button" id="tocDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
Table of Contents
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="" href="/docs/en/2.7.0/">
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/accelerometer/accelerometer.html">
Accelerometer
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/camera/camera.html">
Camera
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/media/capture/capture.html">
Capture
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/compass/compass.html">
Compass
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/connection/connection.html">
Connection
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/contacts/contacts.html">
Contacts
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/device/device.html">
Device
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/events/events.html">
Events
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/file/file.html">
File
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/geolocation/geolocation.html">
Geolocation
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/globalization/globalization.html">
Globalization
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/inappbrowser/inappbrowser.html">
InAppBrowser
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/media/media.html">
Media
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/notification/notification.html">
Notification
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/splashscreen/splashscreen.html">
Splashscreen
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/cordova/storage/storage.html">
Storage
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/getting-started/index.html">
Getting Started Guides
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/command-line/index.html">
Command-Line Usage
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/upgrading/index.html">
Upgrading Guides
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/project-settings/index.html">
Project Settings
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/plugin-development/index.html">
Plugin Development Guide
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/whitelist/index.html">
Domain Whitelist Guide
</a>
</li>
<li>
<a class="" href="/docs/en/2.7.0/guide/cordova-webview/index.html">
Embedding WebView
</a>
</li>
</ul>
</div>
<a class="edit" href="https://github.com/apache/cordova-docs/tree/master/www/docs/en/2.7.0/guide/plugin-development/index.md"><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> </a>
<!-- Version dropdown -->
<div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="versionDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
2.7.0
<span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="versionDropdown">
<!-- List versions available in this language -->
<li>
<a href="/docs/en/dev/" class="missing-page">
dev
</a>
</li>
<li>
<a href="/docs/en/latest/" class="missing-page">
12.x
(Latest)
</a>
</li>
<li>
<a href="/docs/en/11.x/" class="missing-page">
11.x
</a>
</li>
<li>
<a href="/docs/en/10.x/" class="missing-page">
10.x
</a>
</li>
<li>
<a href="/docs/en/9.x/" class="missing-page">
9.x
</a>
</li>
<li>
<a href="/docs/en/8.x/" class="missing-page">
8.x
</a>
</li>
<li>
<a href="/docs/en/7.x/" class="missing-page">
7.x
</a>
</li>
<li>
<a href="/docs/en/6.x/" class="missing-page">
6.x
</a>
</li>
<li>
<a href="/docs/en/5.4.0/" class="missing-page">
5.4.0
</a>
</li>
<li>
<a href="/docs/en/5.1.1/" class="missing-page">
5.1.1
</a>
</li>
<li>
<a href="/docs/en/5.0.0/" class="missing-page">
5.0.0
</a>
</li>
<li>
<a href="/docs/en/4.0.0/" class="missing-page">
4.0.0
</a>
</li>
<li>
<a href="/docs/en/3.6.0/" class="missing-page">
3.6.0
</a>
</li>
<li>
<a href="/docs/en/3.5.0/" class="missing-page">
3.5.0
</a>
</li>
<li>
<a href="/docs/en/3.4.0/" class="missing-page">
3.4.0
</a>
</li>
<li>
<a href="/docs/en/3.3.0/" class="missing-page">
3.3.0
</a>
</li>
<li>
<a href="/docs/en/3.2.0/" class="missing-page">
3.2.0
</a>
</li>
<li>
<a href="/docs/en/3.1.0/" class="missing-page">
3.1.0
</a>
</li>
<li>
<a href="/docs/en/3.0.0/" class="missing-page">
3.0.0
</a>
</li>
<li>
<a href="/docs/en/2.9.0/" class="missing-page">
2.9.0
</a>
</li>
<li>
<a href="/docs/en/2.8.0/" class="missing-page">
2.8.0
</a>
</li>
<li>
<a href="/docs/en/2.7.0/" class="missing-page">
<span class="selected">
2.7.0
</span>
</a>
</li>
<li>
<a href="/docs/en/2.6.0/" class="missing-page">
2.6.0
</a>
</li>
<li>
<a href="/docs/en/2.5.0/" class="missing-page">
2.5.0
</a>
</li>
<li>
<a href="/docs/en/2.4.0/" class="missing-page">
2.4.0
</a>
</li>
<li>
<a href="/docs/en/2.3.0/" class="missing-page">
2.3.0
</a>
</li>
<li>
<a href="/docs/en/2.2.0/" class="missing-page">
2.2.0
</a>
</li>
<li>
<a href="/docs/en/2.1.0/" class="missing-page">
2.1.0
</a>
</li>
<li>
<a href="/docs/en/2.0.0/" class="missing-page">
2.0.0
</a>
</li>
<li>
<a href="/docs/en/1.9.0/" class="missing-page">
1.9.0
</a>
</li>
<li>
<a href="/docs/en/1.8.1/" class="missing-page">
1.8.1
</a>
</li>
<li>
<a href="/docs/en/1.8.0/" class="missing-page">
1.8.0
</a>
</li>
<li>
<a href="/docs/en/1.7.0/" class="missing-page">
1.7.0
</a>
</li>
<li>
<a href="/docs/en/1.6.1/" class="missing-page">
1.6.1
</a>
</li>
<li>
<a href="/docs/en/1.6.0/" class="missing-page">
1.6.0
</a>
</li>
<li>
<a href="/docs/en/1.5.0/" class="missing-page">
1.5.0
</a>
</li>
</ul>
</div>
</div>
<!-- Show warnings for special versions -->
<!-- dev warning -->
<!-- outdated warning -->
<div class="alert docs-alert alert-danger" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
This version of the documentation is outdated!
<a href="/docs/en/latest/">
Click here for the latest released version.
</a>
</div>
<!-- plugin version warning -->
<div id="page-toc-source">
<h1>Plugin Development Guide</h1>
<p>A Cordova plugin bridges a bit of functionality between the WebView
powering a Cordova application and the native platform the Cordova
application is running on. Plugins are composed of a single JavaScript
interface used across all platforms, and native implementations
following platform-specific Plugin interfaces that the JavaScript will
call into. It should be noted that all of the core Cordova APIs are
implemented using this exact architecture.</p>
<p>This guide will go through each step necessary to write a simple Echo
Plugin. The Echo Plugin will pass a string from JavaScript and send it
into the native environment for the supported platforms. The native code
will then return the same string back into the callbacks inside the
plugin&#39;s JavaScript.</p>
<p>This guide should give anyone the necessary overview and level of
detail to write more complex plugins.</p>
<h2>JavaScript</h2>
<p>The entry point for any plugin is JavaScript. The reason developers use
Cordova is so they can use and write JavaScript, not Objective-C,
not Java, not C#. The JavaScript interface for your plugin is the
front-facing and arguably most important part of your Cordova plugin.</p>
<p>You can structure your plugin&#39;s JavaScript however you like. The one
thing you <em>must</em> use to communicate between the Cordova JavaScript
and native environments is the <code>cordova.exec</code> function. Here is an example:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cordova.exec(function(winParam) {}, function(error) {}, "service",
"action", ["firstArgument", "secondArgument", 42,
false]);
</code></pre></div></div>
<p>The parameters explained in more detail:</p>
<ol>
<li><code>function(winParam) {}</code> - Success function callback. Assuming your
<code>exec</code> call completes successfully, this function will be invoked
(optionally with any parameters you pass back to it)</li>
<li><code>function(error) {}</code> - Error function callback. If the operation does
not complete successfully, this function will be invoked (optionally
with an error parameter)</li>
<li><code>"service"</code> - The service name to call into on the native side. This
will be mapped to a native class. More on this in the native guides
below</li>
<li><code>"action"</code> - The action name to call into. This is picked up by the
native class receiving the <code>exec</code> call, and, depending on the
platform, essentially maps to a class&#39;s method. For more detail
please check out the native guides located at the end of this article.</li>
<li><code>[/* arguments */]</code> - Arguments to get passed into the native
environment</li>
</ol>
<h3>Echo Plugin JavaScript Example</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>window.echo = function(str, callback) {
cordova.exec(callback, function(err) {
callback('Nothing to echo.');
}, "Echo", "echo", [str]);
};
</code></pre></div></div>
<p>Let&#39;s dive into this. The plugin attaches itself to <code>window</code>,
specifically to the <code>echo</code> function. Plugin users would then use it as
follows:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>window.echo("echome", function(echoValue) {
alert(echoValue == "echome"); // should alert true.
});
</code></pre></div></div>
<p>First, let&#39;s take a look at the last three arguments to the <code>exec</code>
function. We will be calling the <code>Echo</code> &quot;service&quot;, requesting the <code>echo</code>
&quot;action&quot;, and passing an array of arguments containing the echo string,
which is the first parameter into the <code>window.echo</code> function.</p>
<p>The success callback passed into <code>exec</code> is simply a reference to the
callback function that <code>window.echo</code> takes. We do a bit more for the
error callback: if the native side fires off the error callback, we
simply invoke the success callback and pass into it a &quot;default&quot; string.</p>
<h2>Native</h2>
<p>Once you have defined a JavaScript for your plugin, you need to
complement it with at least one native implementation. Below are
specific guides for each platform Cordova supports. The below guides
will continue on building the simple Echo Plugin example we started in
this guide.</p>
<ul>
<li><a href="android/index.html">Developing a Plugin on Android</a></li>
<li><a href="bada/index.html">Developing a Plugin on Bada</a></li>
<li><a href="blackberry/index.html">Developing a Plugin on BlackBerry</a></li>
<li><a href="ios/index.html">Developing a Plugin on iOS</a></li>
<li><a href="webos/index.html">Developing a Plugin on webOS</a></li>
<li><a href="windows-phone/index.html">Developing a Plugin on Windows Phone</a></li>
<li><a href="tizen/index.html">Developing a Plugin on Tizen</a></li>
</ul>
</div>
</div>
<div class="row">
<div class="blue-divider"></div>
<footer>
<div class="container-fluid">
<div class="row">
<div class="col-sm-9">
<h1>More Resources</h1>
<div class="row">
<div class="col-sm-4">
<h2>General</h2>
<ul class="nav">
<li>
<a target="_blank" href="https://projects.apache.org/project.html?cordova">Apache Project Page</a>
</li>
<li>
<a href="https://www.apache.org/dyn/closer.cgi/cordova">Source Distribution</a>
</li>
<li>
<a target="_blank" href="https://www.apache.org/licenses">License</a>
</li>
<li>
<a href="/artwork">Artwork</a>
</li>
</ul>
</div>
<div class="col-sm-4">
<h2>Development</h2>
<ul class="nav">
<li><a target="_blank" href="https://github.com/apache?utf8=%E2%9C%93&amp;q=cordova-">Source Code</a></li>
<li><a target="_blank" href="https://github.com/apache/cordova#filing-a-bug">Issue Tracker</a></li>
<li><a target="_blank" href="https://stackoverflow.com/questions/tagged/cordova">Stack Overflow</a></li>
<li><a href="/contact">Mailing List</a></li>
<li><a href="/contribute/nightly_builds.html">Nightly builds</a></li>
</ul>
</div>
<div class="col-sm-4">
<h2>Apache Software Foundation</h2>
<ul class="nav">
<li>
<a target="_blank" href="https://www.apache.org/">About ASF</a>
</li>
<li>
<a target="_blank" href="https://www.apache.org/events/current-event">Events</a>
</li>
<li>
<a target="_blank" href="https://www.apache.org/foundation/sponsorship.html">Become a Sponsor</a>
</li>
<li>
<a target="_blank" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
<li>
<a target="_blank" href="https://www.apache.org/security/">Security</a>
</li>
<li>
<a target="_blank" href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy policy</a>
</li>
</ul>
</div>
</div>
</div>
<div class="col-sm-3">
<h1>Contribute</h1>
<p style="padding-top:20px"><strong>Help Cordova move forward!</strong></p>
<p>Report bugs, improve the docs, or contribute to the code.</p>
<a href="/contribute" class="btn btn-lg btn-primary">
Learn More
</a>
<p style="padding-top:20px"> <a href="https://twitter.com/apachecordova" class="twitter-follow-button" data-show-count="false">Follow @apachecordova</a></p>
</div>
</div>
<p class="copyright_text">
Copyright &copy; 2024 <a href="https://apache.org">The Apache Software Foundation</a>, Licensed under the <a target="_blank" href="https://www.apache.org/licenses/">Apache License, Version 2.0</a>.<br/>
Apache and the Apache feather logos are <a target="_blank" href="https://www.apache.org/foundation/marks/list/">trademarks</a> of The Apache Software Foundation.
<br/>
<p>See the <a href="/attributions/">attributions page</a> for other copyright & trademark notices.</p>
</p>
</div>
</footer>
</div>
</div>
</div>
<script defer type="text/javascript" src="/static/js/lib/toc.min.js"></script>
<script defer type="text/javascript" src="/static/js/docs.js"></script>
<script defer type="text/javascript" src="/static/js/index.js"></script>
<script defer type="text/javascript" src="/static/js/twitter.js"></script>
</body>
</html>