Building HTML5
Tablet Apps
for iOS and Android
MINNEWEBCON 2012
@skirchmeier
@mikebollinger
Slide 2
Slide 2 text
No content
Slide 3
Slide 3 text
HTML5 apps
kinda suck.
The elephant in the room:
Slide 4
Slide 4 text
Native vs. HTML5
Slide 5
Slide 5 text
Native
-- Expensive to develop
HTML5
+ Cheaper to develop
-- One platform at a time
+ Snappy
+ Refined (true native feel)
+ Full featured -- Limited features
-- Unrefined
-- Slower
+ All platforms at a time
Slide 6
Slide 6 text
Reasons
Slide 7
Slide 7 text
Money
1
Slide 8
Slide 8 text
Time
2
Slide 9
Slide 9 text
Audience
3
Slide 10
Slide 10 text
Control
4
Slide 11
Slide 11 text
Money
1
Time
2
Audience
3
Control
4
Slide 12
Slide 12 text
5
Design Patterns
T A B L E T S
H A V E
F L E X I B L E
Slide 13
Slide 13 text
Money
1
Time
2
Audience
3
Control
4
Flexible
Design
Patterns
5
Slide 14
Slide 14 text
Change the
game.
Slide 15
Slide 15 text
Examples
Slide 16
Slide 16 text
Best Buy
http://bby-uv.appspot.com/
Financial Times
http://app.ft.com
Proof
http://proofwhisky.com
Slide 17
Slide 17 text
Best Buy
http://bby-uv.appspot.com/
Financial Times
http://app.ft.com
Proof
http://proofwhisky.com
iOS Only >!
iOS Only >!
Slide 18
Slide 18 text
Frameworks
Slide 19
Slide 19 text
jQuery Mobile
jQTouch
Sencha Touch
Slide 20
Slide 20 text
Native Wrappers
Slide 21
Slide 21 text
PhoneGap
Titanium
Slide 22
Slide 22 text
Our Custom App
Slide 23
Slide 23 text
No content
Slide 24
Slide 24 text
http://livefront.com/explore
Slide 25
Slide 25 text
How do we build
this?
Slide 26
Slide 26 text
Step 1:
Travel the world
Slide 27
Slide 27 text
Step 2:
HTML
(sorry)
Slide 28
Slide 28 text
...
...
...
Slide 29
Slide 29 text
...
...
...
Slide 30
Slide 30 text
...
...
...
Slide 31
Slide 31 text
...
...
...
Slide 32
Slide 32 text
...
...
...
Slide 33
Slide 33 text
...
...
...
Slide 34
Slide 34 text
...
...
...
Slide 35
Slide 35 text
Slide 36
Slide 36 text
Slide 37
Slide 37 text
Slide 38
Slide 38 text
Slide 39
Slide 39 text
...
...
...
Slide 40
Slide 40 text
Techniques
Slide 41
Slide 41 text
Transitions
Touch Events
Hardware (GPS)
Work Offline
Sizing
Distribution
Slide 42
Slide 42 text
Transitions
Touch Events
Hardware (GPS)
Work Offline
Sizing
Distribution
Slide 43
Slide 43 text
Transitions
Two ways to animate:
1. jQuery (.animate)
2. CSS (-webkit-transform)
Slide 44
Slide 44 text
Transitions
Two ways to animate:
1. jQuery (.animate)
2. CSS (-webkit-transform)
Hardware (GPS)
function displayCurrentLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
function (position) {
var lat = position.coords.latitude;
var lng = position.coords.longitude;
...
// Display lat/lng
}
);
}
};
Slide 82
Slide 82 text
Transitions
Touch Events
Hardware (GPS)
Work Offline
Sizing
Distribution
Work Offline
var localStoragePhotoData = null;
if (hasLocalStorage) {
localStoragePhotoData = localStorage.getItem(key);
}
if (localStoragePhotoData === null) {
if (hasLocalStorage) {
// Save photo data to localStorage.
var photoDataString = JSON.stringify(PhotoData);
localStorage.setItem(key);
...
}
} else {
// Use photo data cached in localStorage.
var photoDataObject = JSON.parse(localStoragePhotoData);
...
}
Slide 87
Slide 87 text
Work Offline
var localStoragePhotoData = null;
if (hasLocalStorage) {
localStoragePhotoData = localStorage.getItem(key);
}
if (localStoragePhotoData === null) {
if (hasLocalStorage) {
// Save photo data to localStorage.
var photoDataString = JSON.stringify(PhotoData);
localStorage.setItem(key);
...
}
} else {
// Use photo data cached in localStorage.
var photoDataObject = JSON.parse(localStoragePhotoData);
...
}
Slide 88
Slide 88 text
Work Offline
var localStoragePhotoData = null;
if (hasLocalStorage) {
localStoragePhotoData = localStorage.getItem(key);
}
if (localStoragePhotoData === null) {
if (hasLocalStorage) {
// Save photo data to localStorage.
var photoDataString = JSON.stringify(PhotoData);
localStorage.setItem(key);
...
}
} else {
// Use photo data cached in localStorage.
var photoDataObject = JSON.parse(localStoragePhotoData);
...
}
Slide 89
Slide 89 text
Work Offline
var localStoragePhotoData = null;
if (hasLocalStorage) {
localStoragePhotoData = localStorage.getItem(key);
}
if (localStoragePhotoData === null) {
if (hasLocalStorage) {
// Save photo data to localStorage.
var photoDataString = JSON.stringify(PhotoData);
localStorage.setItem(key);
...
}
} else {
// Use photo data cached in localStorage.
var photoDataObject = JSON.parse(localStoragePhotoData);
...
}
Slide 90
Slide 90 text
Transitions
Touch Events
Hardware (GPS)
Work Offline
Sizing
Distribution
Slide 91
Slide 91 text
Sizing
Support different screens
Handle rotation
Hide browser chrome
Disable zoom
Disable other browser features
Slide 92
Slide 92 text
Sizing
Support different screens
Easier in HTML than native
% based layouts
background-size: cover;
Absolute positioning is often necessary