En aquest tema, explorarem com integrar codi natiu en les aplicacions Apache Cordova. Aquesta habilitat és crucial per aprofitar al màxim les capacitats del dispositiu i oferir funcionalitats que no estan disponibles a través dels plugins estàndard de Cordova.
Objectius del tema
- Comprendre quan i per què utilitzar codi natiu en una aplicació Cordova.
- Aprendre a crear i integrar mòduls de codi natiu en aplicacions Cordova.
- Veure exemples pràctics d'ús de codi natiu en Android i iOS.
- Proporcionar exercicis pràctics per reforçar els conceptes apresos.
Quan utilitzar codi natiu?
És recomanable utilitzar codi natiu en les següents situacions:
- Quan necessites accedir a funcionalitats específiques del dispositiu que no estan disponibles a través dels plugins existents.
- Per optimitzar el rendiment de certes operacions que poden ser més eficients en codi natiu.
- Quan vols reutilitzar codi natiu existent en una aplicació Cordova.
Integració de codi natiu en Cordova
Passos generals per integrar codi natiu
- Crear un plugin personalitzat: Els plugins són la manera recomanada per integrar codi natiu en Cordova.
- Escriure el codi natiu: Implementar la funcionalitat desitjada en el llenguatge natiu de la plataforma (Java/Kotlin per Android, Objective-C/Swift per iOS).
- Exposar el codi natiu a JavaScript: Utilitzar l'API de Cordova per permetre que el codi JavaScript de l'aplicació pugui cridar el codi natiu.
Exemple pràctic: Plugin natiu per Android
1. Crear un plugin personalitzat
Primer, crearem l'estructura bàsica del plugin. Suposem que volem crear un plugin que accedeixi a una funcionalitat específica d'Android.
2. Escriure el codi natiu (Java)
Creem un fitxer ExamplePlugin.java
dins del directori src/android
del plugin.
package com.example.plugin; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CallbackContext; import org.json.JSONArray; import org.json.JSONException; public class ExamplePlugin extends CordovaPlugin { @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (action.equals("coolMethod")) { String message = args.getString(0); this.coolMethod(message, callbackContext); return true; } return false; } private void coolMethod(String message, CallbackContext callbackContext) { if (message != null && message.length() > 0) { callbackContext.success("Hello, " + message); } else { callbackContext.error("Expected one non-empty string argument."); } } }
3. Exposar el codi natiu a JavaScript
Creem un fitxer www/ExamplePlugin.js
per exposar la funcionalitat a JavaScript.
var exec = require('cordova/exec'); exports.coolMethod = function(arg0, success, error) { exec(success, error, 'ExamplePlugin', 'coolMethod', [arg0]); };
Exemple pràctic: Plugin natiu per iOS
1. Crear un plugin personalitzat
Igual que en Android, crearem l'estructura bàsica del plugin.
2. Escriure el codi natiu (Objective-C)
Creem un fitxer ExamplePlugin.m
dins del directori src/ios
del plugin.
#import <Cordova/CDV.h> @interface ExamplePlugin : CDVPlugin - (void)coolMethod:(CDVInvokedUrlCommand*)command; @end @implementation ExamplePlugin - (void)coolMethod:(CDVInvokedUrlCommand*)command { NSString* echo = [command.arguments objectAtIndex:0]; CDVPluginResult* pluginResult = nil; if (echo != nil && [echo length] > 0) { pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:echo]; } else { pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Expected one non-empty string argument."]; } [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; } @end
3. Exposar el codi natiu a JavaScript
Igual que en Android, creem un fitxer www/ExamplePlugin.js
per exposar la funcionalitat a JavaScript.
var exec = require('cordova/exec'); exports.coolMethod = function(arg0, success, error) { exec(success, error, 'ExamplePlugin', 'coolMethod', [arg0]); };
Exercicis pràctics
Exercici 1: Crear un plugin natiu per Android
- Crea un plugin que accedeixi a la informació de la bateria del dispositiu.
- Implementa el codi natiu en Java per obtenir el nivell de bateria.
- Exposa la funcionalitat a JavaScript i crida-la des d'una aplicació Cordova.
Exercici 2: Crear un plugin natiu per iOS
- Crea un plugin que accedeixi a la informació de la xarxa del dispositiu.
- Implementa el codi natiu en Objective-C per obtenir l'estat de la xarxa.
- Exposa la funcionalitat a JavaScript i crida-la des d'una aplicació Cordova.
Solucions als exercicis
Solució a l'Exercici 1
1. Crear el plugin
2. Implementar el codi natiu en Java
package com.example.plugin; import org.apache.cordova.CordovaPlugin; import org.apache.cordova.CallbackContext; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; public class BatteryPlugin extends CordovaPlugin { @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (action.equals("getBatteryLevel")) { this.getBatteryLevel(callbackContext); return true; } return false; } private void getBatteryLevel(CallbackContext callbackContext) { IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = cordova.getActivity().registerReceiver(null, ifilter); int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1); float batteryPct = level / (float)scale * 100; callbackContext.success((int)batteryPct); } }
3. Exposar la funcionalitat a JavaScript
var exec = require('cordova/exec'); exports.getBatteryLevel = function(success, error) { exec(success, error, 'BatteryPlugin', 'getBatteryLevel', []); };
Solució a l'Exercici 2
1. Crear el plugin
2. Implementar el codi natiu en Objective-C
#import <Cordova/CDV.h> #import <SystemConfiguration/SystemConfiguration.h> @interface NetworkPlugin : CDVPlugin - (void)getNetworkStatus:(CDVInvokedUrlCommand*)command; @end @implementation NetworkPlugin - (void)getNetworkStatus:(CDVInvokedUrlCommand*)command { CDVPluginResult* pluginResult = nil; SCNetworkReachabilityFlags flags; SCNetworkReachabilityRef address; address = SCNetworkReachabilityCreateWithName(NULL, "www.google.com"); Boolean success = SCNetworkReachabilityGetFlags(address, &flags); CFRelease(address); BOOL isReachable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); if (isReachable) { pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:@"Connected"]; } else { pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Not Connected"]; } [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId]; } @end
3. Exposar la funcionalitat a JavaScript
var exec = require('cordova/exec'); exports.getNetworkStatus = function(success, error) { exec(success, error, 'NetworkPlugin', 'getNetworkStatus', []); };
Conclusió
En aquest tema, hem après com integrar codi natiu en aplicacions Apache Cordova mitjançant la creació de plugins personalitzats. Hem vist exemples pràctics tant per Android com per iOS, i hem proporcionat exercicis per reforçar els conceptes apresos. Aquesta habilitat és essencial per aprofitar al màxim les capacitats del dispositiu i oferir funcionalitats avançades en les teves aplicacions Cordova.
Curs d'Apache Cordova
Mòdul 1: Introducció a Apache Cordova
- Què és Apache Cordova?
- Configuració del teu entorn de desenvolupament
- Creació del teu primer projecte Cordova
- Comprensió de l'estructura del projecte
Mòdul 2: Conceptes bàsics i APIs
- Plugins de Cordova
- Ús de l'API del dispositiu
- Accés a l'emmagatzematge del dispositiu
- Gestió de la informació de la xarxa
- Interacció amb la càmera
Mòdul 3: Interfície d'usuari i experiència d'usuari
- Construcció d'una interfície d'usuari responsiva
- Ús de Cordova amb frameworks (per exemple, Angular, React)
- Gestió de l'entrada de l'usuari
- Implementació de la navegació
Mòdul 4: Funcions avançades de Cordova
- Desenvolupament de plugins personalitzats
- Ús de codi natiu
- Optimització del rendiment
- Depuració i proves
Mòdul 5: Desplegament i distribució
- Construcció per a diferents plataformes
- Signatura i publicació d'aplicacions
- Directrius i millors pràctiques de l'App Store
- Integració i desplegament continus
Mòdul 6: Estudis de cas i aplicacions del món real
- Estudi de cas: Construcció d'una aplicació de llista de tasques
- Estudi de cas: Construcció d'una aplicació del temps
- Estudi de cas: Construcció d'una aplicació de xarxes socials
- Lliçons apreses i millors pràctiques