Firmar el apk para subirlo a Google Play

En el siguiente enlace tienes el 铆ndice para acceder al resto de entradas de este tutorial:

 

隆隆Atenci贸n!! este tutorial se basa en ionic 3 y est谩 desactualizado por lo que es posible que los ejemplos no funcionen en la 煤ltima versi贸n de ionic, haz click aqu铆 para acceder a un tutorial mas actual de Ionic.

Hola a todos,

Como el t铆tulo del post indica hoy vamos a ver c贸mo generar un archivo .apk firmado para poder subirlo a google play.

Este es el 煤ltimo paso que debemos dar una vez tenemos desarrollada y lista nuestra aplicaci贸n para poder subirla a la tienda de aplicaciones de Google.

Android exige que todos los APK se firmen digitalmente con un certificado para poder instalarse.

Cuando firmas un APK se adjunta a este el certificado de clave p煤blica que asocia el APK contigo y con tu clave privada correspondiente. Esto es necesario para poder lanzar cualquier actualizaci贸n de la app asegur谩ndose que provenga del autor original, por eso es important铆simo que guardemos el archivo聽keystore generado a buen recaudo para poder lanzar futuras actualizaciones聽ya que todas las aplicaciones deben usar el mismo certificado durante su vida 煤til.

Un keystore es un campo binario que contiene una o m谩s claves privadas.

Si desarrollas una app nativa puedes generar el keystore firmar el apk desde Android studio, nosotros vamos a ver como firmar una aplicaci贸n聽 聽generada desde ionic o apache cordova desde consola.

Para poder firmar el apk desde consola debemos seguir una serie de pasos que vamos a ver a continuaci贸n:

Lo primero que necesitamos es generar聽 el keystore:

Si por ejemplo nuestra app se llama miapp para generar un keystore聽 abrimos聽 una terminal, nos situamos en la carpeta de nuestro proyecto y escribimos el siguiente comando:

keytool -genkey -v -keystore miapp.keystore -alias miapp -keyalg RSA -keysize 2048 -validity 10000

miapp.keystore es el archivo que se va a generar, el alias es un nombre de identificaci贸n para tu clave, en este caso le hemos llamado miapp.

Con keysize le indicamos que el tama帽o de la clave sea de 2048 bits, es recomendavle dejarlo en este valor.

Por 煤ltimo con -validity聽fijamos el per铆odo de validez de tu clave en a帽os, creo que聽 con 10000 a帽os ser谩 suficiente ;-P.

Al ejecutar el comando nos pide que introduzcamos una serie de datos:

Introduzca la contrase帽a del almac茅n de claves:聽

Volver a escribir la contrase帽a nueva: 

驴Cu谩les son su nombre y su apellido?

驴Cu谩l es el nombre de su unidad de organizaci贸n?

驴Cu谩l es el nombre de su organizaci贸n?

驴Cu谩l es el nombre de su ciudad o localidad?

驴Cu谩l es el nombre de su estado o provincia?

驴Cu谩l es el c贸digo de pa铆s de dos letras de la unidad?

Te pide dos veces la contrase帽a, es importante que recuerdes la contrase帽a que has introducido ya que la necesitar谩s despu茅s.

Al final te muestra los datos que has introducido y te pide confirmaci贸n, le decimos que si:

驴Es correcto CN=Eduardo, OU=Revilla, O=revigames, L=Abadi帽o, ST=Bizkaia, C=ES?

[no]:Si

Lo que os sale debe ser algo parecido a la siguiente imagen:

Bien, con esto ya hemos generado un archivo llamado miapp.keystore en la raiz de nuestro proyecto.

Ahora vamos a crear un nuevo archivo en la聽raiz del proyecto llamado build.json, lo creamos con nuestro editor de c贸digo y dentro escribimos el siguiente c贸digo:

{
     "android": {
         "debug": {
             "keystore": "miapp.keystore",
             "storePassword": "XXXXX",
             "alias": miapp",
             "password" : "XXXX",
             "keystoreType": ""
         },
         "release": {
             "keystore": "miapp.keystore",
             "storePassword": "XXXX",
             "alias": "miapp",
             "password" : "XXXX",
             "keystoreType": ""
         }
     }
 }

El primero es para la versi贸n de debug y “release” es para la versi贸n final que vas a subir a la play store.

En el campo keystore debes poner la ruta del archivo .keystore que acabamos de generar, si lo has generado en la ra铆z solo debes de poner el nombre del archivo, en este caso miapp.keystore.

En alias ponemos el alias que hemos puesto al crear el archivo

Despu茅s en storePassword debe poner la聽contrase帽a del almac茅n de claves que indicaste al crear el archivo.

En password debemos poner la contrase帽a.

Guardamos el archivo y ya solo nos queda generar el apk firmado con el siguiente comando:

ionic cordova build android --release

Si no ha detectado errores y se ha compilado bien podr谩s encontrar el apk firmado que debes subir a play store en la siguiente ruta dentro de tu aplicaci贸n:

/platforms/android/build/outputs/apk/android-release.apk

Eso es todo por hoy, espero que os haya sido de utilidad y ver vuestras apps triunfando en la play store pronto ;-).

Aprovecho para deciros que si has creado alguna app con ionic y la tienes en la play store puedes compartirlo en los comentarios, as铆 servir谩 como inspiraci贸n para que otras personas puedan ver lo que se puede crear con ionic y al mismo tiempo seguro que gan谩is alguna descarga extra que siempre viene bien 馃槈

 

Si necesitas desarrollar una aplicaci贸n m贸vil no dudes en solicitarme un presupuesto sin compromiso:

Un saludo, y si a煤n no lo has hecho no olvides suscribirte a mi blog para no perderte los pr贸ximos posts 聽:-),

Tambi茅n puedes seguirme en Twitter en 鈥嶡revigames y no olvides que me ayudas mucho聽si compartes este post en las redes sociales.

11 comentarios en “Firmar el apk para subirlo a Google Play

  1. Buenas tardes Eduardo,se que no tiene nada que ver con el post pero esto desesperado.

    mira tengo un detalle quiero jalar datos de una tabla en firebase y al momento de igualar el valor que me arroja pero muestra el siguiente error “cannon set property ‘menu’ of null” este es el codigo que utilizo

    this.ofDB.database.ref(“Productos”).orderByChild(“Local”).equalTo(this.local).on(“child_added”, function(snapshot){

    console.log(snapshot.val());
    this.menu=snapshot.val();

    });

    1. Hola Gamster12, Utiliza una funci贸n flecha en lugar de una funci贸n com煤n.
      Las funciones flecha las expliqu茅 en este post: https://reviblog.net/2017/03/07/tutorial-de-ionic-2-crear-una-aplicacion-para-guardar-nuestros-sitios-geolocalizados-parte-2-mostrando-el-mapa/
      Y permiten utilizar this en el contexto actual.

      Es decir, en lugar de:
      this.ofDB.database.ref(鈥淧roductos鈥).orderByChild(鈥淟ocal鈥).equalTo(this.local).on(鈥渃hild_added鈥, function(snapshot){

      console.log(snapshot.val());
      this.menu=snapshot.val();

      });

      utiliza esto:

      this.ofDB.database.ref(鈥淧roductos鈥).orderByChild(鈥淟ocal鈥).equalTo(this.local).on(鈥渃hild_added鈥, (snapshot)=>{

      console.log(snapshot.val());
      this.menu=snapshot.val();

      });

      Espero que te funcione.

      Un saludo

  2. En parte si funciono, pero solo pe mostro un valor, cambie el tipo de variable,
    declare la variable de esta forma menu:any={};
    pero me arrojo el siguiente error “cannon read property ‘Nombre’ of undefined”

    nota:quiero que muestre tantos valores como tengan el mismo valor que la variable local,
    gracias por contestar

    Saludos

  3. hola Eduardo:

    ya lo resolv铆, muchas gracias me ayudo bastante coloque un splice para agregar el valor de mi variable men煤 a otra variable y as铆 logre que mostrara todos los datos,

    te lo agradezco mucho

    saludos

  4. Hola, primero que todo muchas gracias por estos tutoriales tan detallados, he estado sigui茅ndolos y para la aplicaci贸n de guardar sitios he intentado agregar una funci贸n de buscar () pero no s茅 que debe ir en el .ts

    posdata. tambi茅n compr茅 el libro 馃檪

    1. Hola Alejandra,

      Antes de nada muchas gracias por el apoyo y por comprar el Libro :).

      Puedes poner un buscador en el listado a帽adiendo esto a listado.html en ion-header justo despues de cerrar ion-navbar:

      <ion-searchbar (ionInput)=”buscar($event)”
      placeholder=”Buscar”></ion-searchbar>

      Y despu茅s en listado.ts primero defines otra variable de clase que se llame
      sitiosInitial y cuando obtienes los sitios bien desde la base de datos local o desde firebase la igualas a this.sitios es decir this.sitiosInitial = this.sitios;
      y despu茅s a帽ade esta funci贸n que se ejecutara cada vez que escribas en el buscador:

      buscar(ev) {

      let q : any;
      // reseteamos los sitios para que inicialmente contengan toda la lista

      this.sitios = this.sitiosInitial;

      // guardamos en q lo que hemos escrito en searchbar

      q = ev.target.value || ev || ”;

      // si esta vac铆o no filtramos
      if (q!=” && q.trim() == ”) {
      return;
      }

      // con la funci贸n filter obtenemos en this.sitios solo aquellos que coincidan con la b煤squeda
      this.sitios = this.sitios.filter((v) => {
      if (v.description.toLowerCase().indexOf(q.toLowerCase()) > -1) {
      return true;
      }
      return false;
      })
      }

      En este ejemplo filtramos por el campo description, pero puedes cambiar el if para filtrar por otros campos

      Espero que se sea de utilidad.

      Un saludo

  5. Hola Eduardo,

    隆Excelente post!. Hace meses que sigo este blog y la verdad me ha ayudado mucho en el aprendizaje de Ionic, y a realizar mi primera app. La casualidad de que justo cuando termino de desarrollar la versi贸n de android posteas esta entrada que me ha resuelto todas las dudas 馃檪

    As铆 que te tomo la palabra y dejo el enlace de la aplicaci贸n LanzaroteDigital, la cual se trata de una app de noticias de Lanzarote.

    https://play.google.com/store/apps/details?id=com.lanzarotedigital&hl=es

    Tambi茅n aprovecho para abrir un debate, sobre las progressive web apps (PWA) 驴Crees que Ionic es una buena herramienta para ello? As铆 el c贸digo de esta app, podr铆a sustituir por ejemplo a la del actual p谩gina de http://www.lanzarotedigital.com ?

    隆Espero que les guste! Y muchas gracias de nuevo.

    1. Hola writ3r:

      隆Enhorabuena por la app!, si duda es un excelente ejemplo de lo que se puede conseguir con con ionic. La app es muy completa y funciona muy bien, es una gran App si quieres estar al d铆a de lo que sucede en Lanzarote.
      Si alguien vive en la zona o tiene pensado viajar a Canarias sin duda es una app imprescindible.
      En cuanto a las progressive web apps creo que a煤n est谩n en una fase temprana pero no cabe duda que es una tendencia creciente y cada vez veremos m谩s.
      Son muy interesantes las ventajas que ofrece, ionic puede ser una opci贸n muy valida para desarrollar progressive web apps, aunque reconozco que todav铆a no he utilizado ionic para desarrollar ninguna PWA he le铆do algo de informaci贸n al respecto.
      En el momento que haga alguna prueba con ionic para desarrollar alguna PWA lo compartir茅 en el blog.
      Si alg煤n lector tiene ya experiencia desarrollando PWA con ionic ser铆a interesante que dejase un comentario con su opini贸n.

      Un saludo

  6. hola eduardo.

    se que para generar una apk se necesita el sdk, y para el ios necesito tener una mac y el xcode, pero no se que necesito para poder instalar mi aplicacion en un dispositivo movil con sistema operativo windows phone

    espero puedas ayudarme, saludos y que tengas buen dia

  7. Hola, Eduardo, antes de nada muchas gracias por el post, gracias a el he podido firmar y subir mi app creada con ionic a play store de Google.

    Por otro lado, tal y como aconsejas aqu铆 ten茅is el enlace del google paly a mi app.

    AlchemyVapp
    https://play.google.com/store/apps/details?id=pnpk.alchemy.vapp

    Yo he creado una aplicaci贸n para hacer los c谩lculos de las cantidades de l铆quidos que har铆an falta para hacer las recetas de vapeo, esto es, para la gente que vapea y se mezcla sus propios l铆quidos.

    Me idea es ir mejor谩ndola para poder compartir recetas he incluso hacer votaciones de las que cada uno sube, etc…

    Empec茅 a hacerla s贸lo para ver hasta donde se pod铆a llegar con c贸rdova, y acab茅 pas谩ndome a ionic, porque vi que me prestaba mucho trabajo ya hecho…

Deja una respuesta

Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *

Este sitio usa Akismet para reducir el spam. Aprende c贸mo se procesan los datos de tus comentarios.