with
I'm Tom: a software developer with 10 years experience building web and mobile apps.
My professional career includes:
Co-founded startup, built web-based touch-screen apps.
Head of mobile web at award-winning mobile app development agency.
Web-based consultancy, specialising in JavaScript development and training.
Tools of the trade:
Find me everywhere as @fiznool
Course overview:
Mobile app development: what, why and how
Angular, Cordova and the Ionic Framework
Project: build a social weather tracking app
App testing, distribution and updates
Types of mobile app
A mobile app is a software application developed specifically for use on small, wireless computing devices, such as smartphones and tablets, rather than desktop or laptop computers.
What is a mobile app?
It Does One Thing Well.
It Knows its Audience.
It's Stable and Fast.
It's Polished.
What makes a great mobile app?
Why build a mobile app?
Over 1.5 billion smartphones will be shipped in 2017.
The trend is increasing.
Why build a mobile app?
More people are spending more time on their smartphone.
The trend will continue.
Why build a mobile app?
App revenue is due to hit $100B worldwide in 3 years time.
A mobile app works differently to a traditional website.
Traditional Website
Request
Client requests website via URL.
Server responds with HTML document. This includes CSS and JavaScript links.
HTML, CSS, JS
Mobile App
Request
Mobile app already includes app files,
requests data from server.
Server responds with data (JSON). Mobile app populates local layout with returned data.
HTML
CSS
JS
Traditional Website
Asks server for all content: structure, styles and data
Server returns all content, browser renders it.
Mobile App
Already contains structure and styles locally, only asks for data
Server returns data, app renders with local structure/styles.
Smartphone architecture
Hardware (iPhone, Galaxy S7)
Operating System (iOS, Android)
APIs (Cocoa Touch, Android SDK)
App
App
App
App
App Discovery and Delivery: App Stores
There are three main types of mobile app:
Native
Web
Hybrid
Built specifically for one platform: e.g. iOS
Written in platform-specific language: Swift (iOS), Java (Android), C# (Windows Phone)
Will always be the most performant: closest 'to the metal'
Need to completely rewrite the app for each target platform
Full access to hardware sensors
Regular web pages, designed for small screens
Write once, run anywhere: accessed through web browser on any device
Access to some hardware sensors (geolocation, accelerometer)
Will never be as performant as native apps
No App Store presence
A mixture of native and web technologies
Write app using JavaScript
Wrap in a native container, deliver through app stores
'Feels' like a native app, but code can be reused across platforms
Games, highly customised designs: native will be the most perfomant.
Simple web presence, runs on a broad range of devices, don't care about app stores: mobile web.
Otherwise: Many apps will benefit from a hybrid approach.
Within the hybrid type, there are further options.
Native UI based
Write UI layer once per platform, everything else once.
Partial code reuse, good performance.
'Learn Once, Run Anywhere'
Within the hybrid type, there are further options.
Webview UI based
UI written once, with HTML and CSS, rendered by Webview.
Platform-specific UI can be implemented with CSS.
True 'write once, run anywhere'
Which to choose?
Native-UI will provide better performance, but will take longer to build for multiple platforms.
Webview-UI is more mature, and has good library support via Cordova and Ionic.
Both are good options!
Which to choose?
Ionic 1 is based on Angular 1.x
It uses many familiar concepts for web developers.
It has a wide community and is here to stay.
Recommendation: learn Ionic now,
keep React Native and NativeScript on your radar!
Ionic 3 is based on 'modern' Angular
Only released very recently, still needs time to mature
Ionic 1 will continue to be supported for a long time
Recommendation: learn Ionic 1 now,
keep Ionic 3 on your radar!
Ionic 1 supports iOS and Android only. But that's ok:
Native apps benefit from a large Software Development kit for each platform.
The SDK makes it easy to create apps, standardising structure, data access and UI components.
Ionic is the equivalent of this, but for hybrid apps.
Ionic provides:
A large collection of common UI components, such as lists, modals, alerts and more, all implemented in HTML/CSS.
A platform to prototype, scaffold, test, distribute, deploy and update apps.
A community of like-minded developers, making it easy to solve common issues.
Ionic is built on two core technologies:
Angular is a powerful tool that lets you develop highly interactive and intuitive web applications.
Apache Cordova allows for building native mobile applications using HTML, CSS and JavaScript.
A declarative web app framework.
Use custom HTML tags to attach behaviour.
Use JavaScript to create custom behaviours.
Take advantage of a large community:
AngularJS is the most popular web app framework.
Ionic is built on top of AngularJS:
Large number of custom directives
Angular and Angular UI router is bundled with Ionic
Think of an Ionic app as just another Angular app,
with directives and styles specifically designed for mobile.
A container to run HTML, CSS and JavaScript code as a native app.
Provides plugins to access native APIs via JS, such as the camera, filesystem and push notifications.
Loads the code in an embedded Webview, without the standard browser controls, so the app feels like a native app.
Ionic is built on top of Cordova:
Cordova is the container in which your app runs
Cordova is bundled with Ionic
Think of an Ionic app as a regular web app, but run inside Cordova, instead of a browser.
Hardware (iPhone, Galaxy S7)
Operating System (iOS, Android)
Cordova runtime + plugins
AngularJS
Ionic App
Ionic is built using AngularJS.
It's therefore important that we understand the basic Angular concepts.
This section will cover the relevant parts of Angular that will be used for this course.
Dependency Injection
angular
.module('myApp')
.service('MyService', function($http) {
// $http is injected and available for use
});
// Later on...
angular
.module('myApp')
.controller('MyController', function(MyService) {
// MyService is injected and available for use
});
Services / Factories
angular
.module('myApp')
.factory('MyService', function($http) {
return {
fetchAll: function() {
return $http
.get('http://some.example.com/api/items')
.then(function(response) {
return response.data;
});
}
};
});
Controllers & Data Binding
angular
.module('myApp')
.controller('MyController', function($scope) {
$scope.name = 'John Smith';
});
<div ng-controller="MyController">
<p>Hello, my name is {{name}}</p>
</div>
Lists
angular
.module('myApp')
.controller('MyController', function($scope) {
$scope.vegetables = [
{ "name": "Carrot" },
{ "name": "Potato" },
{ "name": "Broccoli" }
];
});
<div ng-controller="MyController">
<ul>
<li ng-repeat="veggie in vegetables">
{{veggie.name}}
</li>
</ul>
</div>
ng-src
angular
.module('myApp')
.controller('MyController', function($scope) {
$scope.img ='snoopy';
});
<div ng-controller="MyController">
<img ng-src="/images/{{img}}.png">
</div>
Conditional Show/Hide
angular
.module('myApp')
.controller('MyController',
function($scope) {
$scope.shouldShow = true;
});
<div ng-controller="MyController">
<p>
This will always be shown.
</p>
<p ng-show="shouldShow">
This will be shown.
</p>
<p ng-show="!shouldShow">
This will be hidden.
</p>
<p ng-hide="shouldShow">
This will be hidden.
</p>
<p ng-if="!shouldShow">
This will be removed from the DOM.
</p>
</div>
Conditional Classes
angular
.module('myApp')
.controller('MyController', function($scope) {
$scope.shouldShow = true;
});
<div ng-controller="MyController">
<p ng-class="
{
muted: shouldShow,
loud: !shouldShow
}">
This will have the class 'muted'.
</p>
</div>
Click handler
angular
.module('myApp')
.controller('MyController', function($scope) {
$scope.submit = function() {
// Handle submission...
}
});
<div ng-controller="MyController">
<button ng-click="submit()">Submit</button>
</div>
Forms
angular
.module('myApp')
.controller('MyController',
function(MyService, $scope) {
$scope.formData = {};
$scope.submit = function() {
MyService.save(formData);
}
});
<div ng-controller="MyController">
<form ng-submit="submit()">
<input name="title" ng-model="formData.title">
<input name="description" ng-model="formData.description">
<input type="submit">
</form>
</div>
UI Router
The de-facto solution to flexible routing with nested views in AngularJS.
A
B
C
UI Router
angular
.module('myApp')
.config(config);
function config($stateProvider, $urlRouterProvider) {
$stateProvider
.state('feed', {
url: '/posts',
templateUrl: 'tmpl/posts/feed.html',
controller: 'FeedController',
controllerAs: '$ctrl'
})
.state('post', {
url: '/posts/:id',
templateUrl: 'tmpl/posts/post.html',
controller: 'PostController',
controllerAs: '$ctrl'
});
$urlRouterProvider.otherwise('posts');
}
These are simple markup templates with specific CSS classes, which render static things like buttons, navigation bars and lists.
These are dynamic components, initiated from your Angular controllers.
Ionic is a hybrid framework, and can create both iOS and Android apps.
iOS apps however can only be built on a Mac, running OS X / macOS.
Android apps can be built and run on Windows, Mac and Linux.
Cordova is the platform which allows mobile apps to be built with web technologies.
We'll spend some time now getting Cordova installed on our systems so we can deploy a Cordova app to our phones.
The process varies depending on whether you use a Mac or a Windows computer.
Since Ionic is web-based, a big bonus is that we can use our desktop browser to test the app.
However, we will still need to use a real device for testing native features, such as camera access.
Install dependencies:
We'll be using the terminal when developing our Ionic apps.
If you are using Windows, the Git Bash program that was installed by the git installer should be used.
Otherwise, for Mac, use the default Terminal app.
npm install -g ionic gulp bower
npm is a package manager included with node.js.
Open your terminal and type:
This command installs these packages globally, so they can be used in the terminal.
ionic start tabsApp tabs --type=ionic1
cd tabsApp
ionic serve
Open a terminal and type the following:
Your browser should open and display the demo tabs app.
ionic start tabsApp tabs --type=ionic1
ionic start is a command to create a new ionic project. You pass in the directory name to create, the template to use and the type of project to generate (Ionic 1).
ionic serve
This starts a local web server and opens your browser at the URL, showing the Ionic app in your desktop browser. Remember, ionic is just HTML, CSS and JavaScript!
We can easily view this on a desktop browser. This makes development really fast, since we can use the same desktop development and debugging tools as for regular websites.
ionic cordova platform add ios
ionic cordova emulate ios
The app will open in the iOS simulator.
ionic cordova build ios
open platforms/ios/MyApp.xcodeproj
ionic cordova platform add android
ionic cordova emulate android
The app will open in the Android emulator.
ionic cordova run android
The app will be deployed to the phone, and will automatically open.
ionic cordova platform add android
Ionic does not make any assumptions about your target platform. You must add each platform manually with this command. It only needs to be run once per platform. Once it has been run, you can deploy the app to a device connected to your computer.
ionic cordova run android
This command builds a native app from your Ionic codebase, deploys it to a connected device, and opens it automatically. One command is all it takes!