73
Desmistificando o PhoneGap/Cordova Loiane Groner http://loiane.com

MobileConf 2015: Desmistificando o Phonegap (Cordova)

Embed Size (px)

Citation preview

Page 1: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Desmistificando o PhoneGap/Cordova

Loiane Groner http://loiane.com

Page 2: MobileConf 2015: Desmistificando o Phonegap (Cordova)

• 9+ XP TI

• Ciência da Computação 2008/2

• Java, Sencha, Phonegap

• http://loiane.com

• Livros:

Loiane Groner

Page 3: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Motivação

Page 4: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Preciso de uma APP

Page 5: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 6: MobileConf 2015: Desmistificando o Phonegap (Cordova)

IDE Emulador Store Usuário final

IDE Emulador Store Usuário final

IDE Emulador Store Usuário final

Page 7: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 8: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Phonegap

Page 9: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Framework JavaScript open source para desenvolvimento de apps mobile híbridas

Page 10: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Híbrido?

Page 11: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 12: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Nativo Web

Page 13: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 14: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 15: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 16: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Como funciona

Page 17: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Seu Código

Page 18: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Web View Nativa (Browser)Seu Código

Page 19: MobileConf 2015: Desmistificando o Phonegap (Cordova)

APIs Nativas

Web View Nativa (Browser)Seu Código

Page 20: MobileConf 2015: Desmistificando o Phonegap (Cordova)

App Nativa: .apk, .ipa, etcAPIs Nativas

Web View Nativa (Browser)Seu Código

Page 21: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 22: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Interface de uma app phonegap

É uma instância do browser nativo

100% largura e altura

Browser nativo (WebView)sem barra de favoritos

sem barra para mudar url

Page 23: MobileConf 2015: Desmistificando o Phonegap (Cordova)

O que instalar

Page 24: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Phonegap CLI Corvova CLI

Page 25: MobileConf 2015: Desmistificando o Phonegap (Cordova)

http://nodejs.org/

Page 26: MobileConf 2015: Desmistificando o Phonegap (Cordova)

sudo npm install -g cordova

sudo npm install -g phonegap

Linux ou Mac OS

Page 27: MobileConf 2015: Desmistificando o Phonegap (Cordova)

npm install -g cordova

npm install -g phonegap

Windows

Page 28: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Phonegap Phonegap Dev App

Phonegap Build Phonegap Enterprise

Cordova Comunidade Código fonte

Plugins APIs

Ponte com plataforma nativa

Page 29: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Criando um projeto

Page 30: MobileConf 2015: Desmistificando o Phonegap (Cordova)

phonegap create hello com.loiane.hello HelloWorld

cordova create hello com.loiane.hello HelloWorld

Page 31: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Testando e emulando localmente

Page 32: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 33: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Plugins:

acesso recursos do device

Page 34: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 35: MobileConf 2015: Desmistificando o Phonegap (Cordova)

cordova plugin add org.apache.cordova.camera

phonegap plugin add org.apache.cordova.camera

Page 36: MobileConf 2015: Desmistificando o Phonegap (Cordova)

function capturePhoto() { navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, destinationType: destinationType.DATA_URL }); }

Page 37: MobileConf 2015: Desmistificando o Phonegap (Cordova)

function capturePhoto() { navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, destinationType: destinationType.DATA_URL }); }

function onPhotoDataSuccess(imageData) { var smallImage = document.getElementById('smallImage'); smallImage.style.display = 'block'; smallImage.src = "data:image/jpeg;base64," + imageData; }

Page 38: MobileConf 2015: Desmistificando o Phonegap (Cordova)

function capturePhoto() { navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, destinationType: destinationType.DATA_URL }); }

function onPhotoDataSuccess(imageData) { var smallImage = document.getElementById('smallImage'); smallImage.style.display = 'block'; smallImage.src = "data:image/jpeg;base64," + imageData; }

<button onclick="capturePhoto();">Capturar foto</button> <br> <img style="display:none;" id="smallImage" src="" />

Page 39: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 40: MobileConf 2015: Desmistificando o Phonegap (Cordova)

import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView;

public class MyCameraActivity extends Activity { private static final int CAMERA_REQUEST = 1888; private ImageView imageView;

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.imageView = (ImageView)this.findViewById(R.id.imageView1); Button photoButton = (Button) this.findViewById(R.id.button1); photoButton.setOnClickListener(new View.OnClickListener() {

@Override public void onClick(View v) { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_REQUEST); } }); }

protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) { Bitmap photo = (Bitmap) data.getExtras().get("data"); imageView.setImageBitmap(photo); } } }

Page 41: MobileConf 2015: Desmistificando o Phonegap (Cordova)

- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller usingDelegate: (id <UIImagePickerControllerDelegate, UINavigationControllerDelegate>) delegate { if (([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera] == NO) || (delegate == nil) || (controller == nil)) return NO; UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; // Displays a control that allows the user to choose picture or // movie capture, if both are available: cameraUI.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType: UIImagePickerControllerSourceTypeCamera]; // Hides the controls for moving & scaling pictures, or for // trimming movies. To instead show the controls, use YES. cameraUI.allowsEditing = NO; cameraUI.delegate = delegate; [controller presentModalViewController: cameraUI animated: YES]; return YES;}

Page 42: MobileConf 2015: Desmistificando o Phonegap (Cordova)

// Check to see if the camera is available on the device.if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back) || PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Front)){ // Initialize the camera, when available. if (PhotoCaptureDevice.AvailableSensorLocations.Contains(CameraSensorLocation.Back)) { // Use the back camera. System.Collections.Generic.IReadOnlyList<Windows.Foundation.Size> SupportedResolutions = PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Back); Windows.Foundation.Size res = SupportedResolutions[0]; this.captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Back, res); } else { // Otherwise, use the front camera. System.Collections.Generic.IReadOnlyList<Windows.Foundation.Size> SupportedResolutions = PhotoCaptureDevice.GetAvailableCaptureResolutions(CameraSensorLocation.Front); Windows.Foundation.Size res = SupportedResolutions[0]; this.captureDevice = await PhotoCaptureDevice.OpenAsync(CameraSensorLocation.Front, res); } ... ... ...

//Set the VideoBrush source to the camera. viewfinderBrush.SetSource(this.captureDevice);

// The event is fired when the shutter button receives a half press. CameraButtons.ShutterKeyHalfPressed += OnButtonHalfPress;

// The event is fired when the shutter button receives a full press. CameraButtons.ShutterKeyPressed += OnButtonFullPress;

// The event is fired when the shutter button is released. CameraButtons.ShutterKeyReleased += OnButtonRelease; }else{ // The camera is not available. this.Dispatcher.BeginInvoke(delegate() { // Write message. txtDebug.Text = "A Camera is not available on this phone."; });}

Page 43: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Trabalhando com Views

Page 44: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 45: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Topcoat

DOM

Architecture

UI

Full Stack

Page 46: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 47: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 48: MobileConf 2015: Desmistificando o Phonegap (Cordova)

<ion-tabs>

<ion-tab title="Home" icon="ion-home"> <ion-nav-view name="home"></ion-nav-view> </ion-tab>

<ion-tab title="About" icon="ion-information"> <ion-nav-view name="about"></ion-nav-view> </ion-tab>

<ion-tab title="Contact" icon="ion-ios7-world"> <ion-nav-view name="contact"></ion-nav-view> </ion-tab>

</ion-tabs>

Page 49: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Fazendo build

Page 50: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Enviando pra App Store

Page 51: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 52: MobileConf 2015: Desmistificando o Phonegap (Cordova)

cordova platform add android

Add Plataforma

phonegap platform add android

Page 53: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 54: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 55: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Phonegap Build

apps open source: grátis (github)apps código privado: pago

Page 56: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 57: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 58: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 59: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 60: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 61: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Processo de enviar para apps store é nativo

Page 62: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Processo de enviar para apps store é nativo

Page 63: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Exemplos de Apps

Page 64: MobileConf 2015: Desmistificando o Phonegap (Cordova)

http://phonegap.com/app/

Page 65: MobileConf 2015: Desmistificando o Phonegap (Cordova)

http://showcase.ionicframework.com/

Page 66: MobileConf 2015: Desmistificando o Phonegap (Cordova)

http://www.jqmgallery.com/

Page 67: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 68: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 69: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Quero Aprender!

Page 70: MobileConf 2015: Desmistificando o Phonegap (Cordova)
Page 71: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Topcoat

DOM

Architecture

UI

Full Stack

Page 72: MobileConf 2015: Desmistificando o Phonegap (Cordova)

http://loiane.com

fb.com/loianegroner

@loiane

https://github.com/loiane

youtube.com/user/Loianeg

Page 73: MobileConf 2015: Desmistificando o Phonegap (Cordova)

Obrigada!