arcgis api for javascript: building mobile web apps · managing app life-cycle working with locally...

70
Building Mobile Apps with the ArcGIS API for JavaScript Andy Gup, Lloyd Heberlie, Thomas Other

Upload: others

Post on 03-Jun-2020

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Building Mobile Apps with the ArcGIS API for JavaScript

Andy Gup, Lloyd Heberlie, Thomas Other

Page 2: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Agenda

Capabilities

Managing app life-cycle

Working with locally hosted builds

Working from JS frameworks

Debugging

Working with 3D on Mobile

Page 3: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Expectations

Page 4: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Lloyd Heberlie

Capabilities

Page 5: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Demo

Touch

Page 6: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

BasemapGallery

Page 7: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

BasemapToggle

Page 8: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

BasemapToggle

Page 9: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Home

Page 10: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

LayerList

Page 11: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

LayerList action

Page 12: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Expand

Page 13: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Compass

Page 14: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Compass

Page 15: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Demo

Locate

Page 16: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Popups

Page 17: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Calcite Maps - Settings

Page 18: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Calcite Maps - Settings

Page 19: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Calcite Maps - Basemaps

Page 20: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Calcite Maps - Basemaps

Page 21: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

HTML5 input types

type=“email” type=“tel” type=“date”

Page 22: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Mobile media queries

1

2

Page 23: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Mobile media queries

macOS

Android

iPhone

iPad

Page 24: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Mobile media queries

Page 25: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Mobile media queries

Page 26: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Demos

Capabilities

Page 27: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Managing initial load times

Page 28: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Initial loading in a mobile browser

Often misunderstood

Many things happening

Vulnerable to timing issues

Consider user’s experience

Page 29: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Initial loading in a mobile browser

CSS

3rd party libraries

Frameworks

Framework plugins

ArcGIS JS API

GIS queries

GET map tiles

Page 30: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Initial loading in a mobile browser

CSS

3rd party libraries

Frameworks

Framework plugins

ArcGIS JS API

GIS queries

GET map tiles

Page 31: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Initial loading in a mobile browser

Wait for framework initialization- In Angular: implements OnInit

- In Cordova: ‘deviceready’ event

- In ArcGIS: dojo/domReady!

Page 32: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Consider synchronous patterns

Framework init

dojo/ready!

Map ready

Feature service loaded

Page 33: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Lazy load modules and libraries

Wait for user input

Map ready

Load widget

Page 34: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Lazy load demo

Demo

Page 35: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Reserve async for after app load

Wait for framework initialization- In Angular: implements OnInit

- In Cordova: ‘deviceready’ event

- In ArcGIS: dojo/domReady!

Page 36: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

MapView ready?

The View has a Map

View container size is greater than zero

View has a spatial reference

API Reference MapView.ready

Demo

Page 37: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Loadable Patterns

Any resource that handles async data access

Examples: feature layers, tasks, web maps

not-loaded

loading

failed

loaded

Page 38: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

API reference

WebMap.loadStatus

Page 39: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

load() example

Demo

Page 40: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Splash Screens

Distract end user from long load times

Gives you control over when main app visible

Wait for MapView.then()

https://github.com/andygup/splash-screen-js

Page 41: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Lloyd Heberlie

Using local builds

Page 42: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Why?

More modules – more requests

Optimized build for app

Web application vs. Hybrid

Reduce http service calls for Hybrid apps

Page 43: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

How to create custom builds?

ArcGIS API for JavaScript Web Optimizer – 3x

Bower

npm

Page 44: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Demo

Using local builds

Page 45: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

More information

• Optimizing Your JavaScript App for Performance

- Thursday, March 8 - 10:30 - 11:30 am

- Primrose A

Page 46: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Working with Cordova and IonicNative Mobile

Page 47: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Cordova/Phonegap

Wait for “deviceready” event

https://github.com/Esri/quickstart-map-phonegap

Page 48: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Ionic and loading ArcGIS JavaScript modules

Many helper libraries!

• angular-esri-loader (Angular 4+, wraps esri-loader)

• esri-loader (platform agnostic)

• Ionic2-esri-map (Sample app)

• ArcGIS TypeScript definitions

Page 49: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Working with FrameworksMobile browser-only

Page 50: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Other frameworks

• Plain old Bootstrap

• calcite-maps

• ember-esri-loader

• esri-loader-react

• esri-system-js

Page 51: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Lloyd Heberlie

Debugging and testing

Page 52: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Physical devices

http://blog.adtile.me/2014/01/08/adtile-device-lab/

Page 53: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Remote debugging

• Safari Web Inspector Remote

• Google Chrome remote debugging

• http://livereload.com/

• Browser-sync

Page 54: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Enable iOS remote web inspection

Page 55: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Enable Android remote web inspection

Page 56: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Content Security Policy (CSP)

Page 57: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Demo

Debugging Mobile

Page 58: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Working with 3D on Mobile

Page 59: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

TopicsGPU HardwareGPU Architecture3D on Mobile DevicesPerformanceJavaScript APIExampleProgressive Web Apps

Page 60: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

GPU Hardware

Apple A10

TBDRArchitecture

650 MHz Clock

12 Clusters

> 500 GFLOPS

Intel Kaby Lake

TB/EZ IMRArchitecture

1115 MHz Clock

48 Clusters

> 730 GFLOPS

nVidia Pascal

TB/EZ IMRArchitecture

1465 MHz Clock

256 Clusters

> 750 GFLOPS

Source http://kyokojap.myweb.hinet.net/gpu_g�ops/

Page 61: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

GPU ArchitectureIMR vs. TBDR

Immediate Mode

Renderer

Tile Based Delayed

Renderer

Source https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/

Page 62: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

GPU ArchitectureSimple Rendering

Immediate Mode Renderer Tile Based Delayed RendererTexture Reads 150 * 4 Bytes 150 * 4 BytesDepth Reads 200 * 4 bytes 0 bytesDepth Writes 150 * 4 bytes 0 bytesColor Writes 150 * 4 bytes 0 bytesTotal Bandwidth 2600 bytes 600 bytes

Source https://www.anandtech.com/show/4686/samsung-galaxy-s-2-international-review-the-best-rede�ned/15

Page 63: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

ArcGIS JavaScript API3D on Mobile Devices

Works on mobileApple iPhone 8Apple iPad Pro 2Samsung Galaxy S8Samsung Galaxy Tab S3

It's as simple as opening a webpagehttp://www.arcgis.com/home/webscene/viewer.html

Page 64: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

ArcGIS JavaScript APIPerformance

Performance can vary across

HardwareOperating SystemBrowser Vendor

Poor performance can be avoided by

keeping the number of layers limited (10 - 30)using appropriate symbols for everyvisualizationusing advantageous viewpointsthrottling resource consumptionturning off features

Page 65: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

JavaScript ExampleChange Quality and Visualizations

featureLayer.renderer.symbol

view.environment.lighting.directShadowsEnabled

view.qualityPro�le view.environment.atmosphere.quality

require([ "esri/Map", "esri/layers/FeatureLayer", "esri/layers/SceneLayer", "esri/views/SceneView" ], function( Map, FeatureLayer, SceneLayer, SceneView ) { var view = new SceneView({ map: new Map({ basemap: "satellite", ground: "world-elevation", layers: [ new FeatureLayer({ url: "//services.arcgis.com/..." }), new SceneLayer({ url: "//services.arcgis.com/..." }) ] }), container: "viewDiv" }); });

> q: h s: 0 58 fps

Page 66: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Progessive Web AppsService Workers #1

// index.html

if ('serviceWorker' in navigator) {

navigator.serviceWorker.register('./service-worker.js', { scope: './' }) .then(function() {

if (navigator.serviceWorker.controller) {

// Service Worker is active

} else {

// Service Worker is installed but inactive

}

}) .catch(function(error) {

// An error occurred during Service Worker creation

});

} else {

// The current browser doesn't support service workers

}

Page 67: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Progessive Web AppsService Workers #2

// service-worker.js // Called during app installation self.addEventListener("install", function(event) { event.waitUntil( caches.open("cache_v1") .then(cache => { return cache.add("./index.html"); // Add index to cache }); ); }); // Called during app start self.addEventListener("activate", function(event) {}); // Called on every network request when installed and active self.addEventListener("fetch", function(event) { event.respondWith( caches.open("cache_v1").then(function(cache) { return cache.match(event.request).then(function(response) { if (response) { return response; // Serving response from cache } return fetch(event.request.clone()).then(function(response) { return response; // Serving response from network }); }); })

Page 68: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Progessive Web AppsWeb App Manifest

// index.html

<link rel="manifest" href="./manifest.json">

// manifest.json

{ "short_name": "Hiking trails", "name": "Hiking trails Swiss National Park",

"icons": [{ "src": "src/img/android-icon-36x36.png", "sizes": "36x36", "type": "image/png" }],

"start_url": "index.html", "display": "standalone",

"background_color": "#2d2b07", "theme_color": "#b5e2c1" }

Page 69: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements

Lloyd Heberlie – [email protected]

Andy Gup – [email protected]

Thomas Other – [email protected]

Page 70: ArcGIS API for JavaScript: Building Mobile Web Apps · Managing app life-cycle Working with locally hosted builds Working from JS frameworks Debugging ... -In Angular: implements