Since Apache Cordova apps are written mostly in JS, it is actually really easy to use Socket.IO! Let’s walk through a small example.
First we prepare a simple server:
var server = require('http').createServer();
var io = require('socket.io')(server);
io.sockets.on('connection', function (socket) {
console.log('socket connected');
socket.on('disconnect', function () {
console.log('socket disconnected');
});
socket.emit('text', 'wow. such event. very real time.');
});
server.listen(3000);
This server will simply listen to Socket.IO client connections, and will emit some text to them via a text
event.
Now let’s get get down to the point. We want to start off by creating a new Cordova project to start modifying. Let’s start from scratch.
Running
npm install -g cordova
will install the actual Cordova cli tool we use to create projects, install/remove dependencies, and launch our emulator among other things.
cordova create socket.io-example socket.io.example socket.io-example
will make a new project template for us to start modifying. Feel free to poke around the newly created folder, called socket.io-example
and take a look at some of the created files.
You should now be in the project folder. If you didn’t navigate there yet in command line, do it now with cd socket.io-example
.
Since I’m developing this example on OS X, I’m going to build for iOS. You could do it similarly for Android. To add the build target, run the following:
cordova platform add ios
Next we want to build all the native components. We can do this by running
cordova build ios
Now let’s actually run the template application to see that everything is working. If you are on OS X, you can install the iOS emulator like so
brew install ios-sim
You should see the emulator open up with something like this when running cordova emulate ios
:
Now that you see everything working with the actual setup, let’s start write some code. Open up www/index.html
in your project directory. It should look something like this:
<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<html>
<head>
<meta charset="utf-8" />
<meta name="format-detection" content="telephone=no" />
<!-- WARNING: for iOS 7, remove the width=device-width and height=device-height attributes. See https://issues.apache.org/jira/browse/CB-4323 -->
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
<link rel="stylesheet" type="text/css" href="css/index.css" />
<meta name="msapplication-tap-highlight" content="no" />
<title>Hello World</title>
</head>
<body>
<div class="app">
<h1>Apache Cordova</h1>
<div id="deviceready" class="blink">
<p class="event listening">Connecting to Device</p>
<p class="event received">Device is Ready</p>
</div>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript">
app.initialize();
</script>
</body>
</html>
To begin, we need to get the Socket.IO-client script. We can take it from the CDN like so:
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js"></script>
<script type="text/javascript" src="js/index.js"></script>
Now to add actual logic, let’s write things below the app.initialize
call. We might want to make sure that the device has loaded the application before running any of our code. We can do this like so:
<script type="text/javascript">
app.initialize();
document.addEventListener('deviceready', function() {
// code goes here
});
</script>
This event will fire when the application has fully loaded. To add some actual logic, we just need to fill in that function. Let’s make something that receives the data emitted by our server on socket connection, and bring a notification box to show that text. Here’s what you could do:
<script type="text/javascript">
app.initialize();
document.addEventListener('deviceready', function() {
socket.on('connect', function() {
socket.on('text', function(text) {
alert(text);
});
});
});
</script>
Let’s run the emulator again with cordova emulate ios
, and here’s what you should see:
That’s it! I hope this will help to get you started! Have fun hacking!