Publicado por Wayne Piekarski, representante de programadores para IoT

Hoy lanzamos la siguiente Developer Preview 4 (DP4) de Android Things con nuevo hardware compatible, funciones y corrección de errores en la plataforma. El objetivo de Android Things es permitirles a los programadores de Android que compilen rápidamente dispositivos inteligentes, y los escalen sin inconvenientes de prototipo a producción usando un Board Support Package (BSP) proporcionado por Google.
AIY Projects y Google Assistant SDK
Este mes, anunciamos una sociedad con AIY Projects, que permite que Android Things admita el kit de voz basado en Raspberry Pi. Y ahora, con DP4, se proporcionan los controladores necesarios para admitir el Google Assistant SDK en todos los grupos de desarrollo con certificación de Android Things. Obtén más información a partir de las instrucciones que se proporcionan en el ejemplo.
Nuevo hardware y controladores compatibles
Estamos agregando un Board Support Package para NXP i.MX7D, que admite un mejor rendimiento que i.MX6UL y continúa usando un diseño de sistema en módulo (SoM) de bajo consumo de energía. Se agregó compatibilidad con el bus Inter-IC Sound (I2S) a Peripheral I/O API, y ahora los controladores de audio pueden escribirse en el espacio del usuario para reproducirse en hardware de sonido conectado mediante un bus I2S. El ejemplo del kit de voz AIY muestra cómo usar el soporte I2S para audio. También permitimos que los programadores habiliten y deshabiliten perfiles de Bluetooth en el tiempo de ejecución.
Sistema en módulo NXP i.MX7D
Ejemplo de hardware de producción
Android Things se centra en ayudar a los programadores a crear dispositivos listos para producción que puedan llevar al mercado. Esto significa la creación de hardware personalizado, además de que el software se ejecute en sistema-en-módulo (SoM) de Android Things. Como parte de este esfuerzo, hemos lanzado Edison Candle, el primero de una serie de ejemplos de producción que muestran hardware y software que fueron diseñados para operar juntos. El código se encuentra en GitHub y los archivos de diseño del hardware están en CircuitHub, y pueden ser fácilmente producidos por muchas empresas externas.
Ejemplo Edison Candle con su fuente y esquemas
Gracias a todos los programadores que enviaron sus comentarios para las Developer Preview anteriores. Continúen enviándonos sus comentarios al completar informes de error y solicitudes de funciones, y realizando las preguntas que tengan en stackoverflow. Si quieren descargar imágenes para DP4, visiten la página de descarga de Android Things y busquen los cambios en las notas de la versión. También pueden unirse a la Comunidad de programadores IoT de Google en Google+, un excelente recurso para obtener información actualizada y debatir ideas, con más de 4.900 miembros. También ofrecemos charlas geniales sobre Android Things e IoT en Google I/O, que pueden ver mediante transmisión en tiempo real o como una grabación más adelante.






Los investigadores requieren una gran cantidad de recursos informáticos para entrenar los modelos de aprendizaje automático (AA) que han producido recientemente grandes avances en el ...


Los investigadores requieren una gran cantidad de recursos informáticos para entrenar los modelos de aprendizaje automático (AA) que han producido recientemente grandes avances en el diagnóstico médico por imágenes, la máquina neural de traducción, juegos y muchos otros dominios. Creemos que cantidades mucho más grandes de cálculos computacionales permitirán que los programadores inventen nuevos tipos de modelos de AA que serán aun más precisos y útiles.

Para acelerar el ritmo de la investigación abierta en aprendizaje automático, estamos presentando TensorFlow Research Cloud (TFRC), un clúster de 1.000 TPU en la nube que estará disponible sin cargo para admitir una extensa gama de proyectos de investigación ampliamente computacionales que de otra forma serían imposibles de lograr.
TensorFlow Research Cloud ofrece a los investigadores los siguientes beneficios:
  • Acceso a las completamente nuevas TPU en la nube de Google, que aceleran el entrenamiento y la inferencia
  • Hasta 180 teraflops de rendimiento de punto flotante por cada TPU en la nube
  • 64 GB de memoria de ancho de banda ultra alta por cada TPU en la nube
  • Próximas interfaces de programación de TensorFlow
Puedes registrarte aquí para solicitar que te notifiquemos cuando se abra el proceso de aplicación de TensorFlow Research Cloud y puedas compartir más información sobre tus necesidades computacionales, si lo deseas. Tenemos pensado evaluar aplicaciones de forma constante en busca de las propuestas más creativas y ambiciosas.

El programa TensorFlow Research Cloud no está limitado a un nivel académico; reconocemos que personas con una gran variedad de afiliaciones, roles y experiencia están realizando aportes importantes a la investigación en aprendizaje automático, y alentamos especialmente la participación de aquellos con trayectorias no tradicionales. Se otorgará acceso a personas seleccionadas durante un tiempo limitado de cómputo, y los investigadores son bienvenidos a participar varias veces con varios proyectos.
Dado que el objetivo principal de TensorFlow Research Cloud es beneficiar la comunidad de investigación de aprendizaje automático en su totalidad, se esperará que los participantes exitosos realicen lo siguiente:
  • Compartan su investigación basada en TFRC con el mundo a través de publicaciones revisadas por colegas, código fuente abierto, entradas de blogs u otros medios abiertos.
  • Compartir opiniones concretas y constructivas con Google para ayudarnos a mejorar el programa TFRC y la plataforma Cloud TPU subyacente con el tiempo.
  • Imagina un futuro en el que la aceleración del AA sea abundante y se desarrollen nuevos tipos de modelos de aprendizaje automático con antelación a ese futuro.
Para las empresas interesadas en usar TPU en la nube para investigaciones y desarrollos privados, ofreceremos un programa Cloud TPU Alpha paralelo. Puedes registrarte aquí para obtener más información sobre este programa. Te recomendamos que participes en el programa Cloud TPU Alpha si estás interesado en lo siguiente:
  • Acelerar el entrenamiento de modelos de AA propios; los modelos que requieren semanas de entrenamiento en otro hardware pueden entrenarse en días o incluso horas en TPU en la nube.
  • Acelerar el procesamiento de lotes de conjuntos de datos de escala industrial: imágenes, videos, audio, texto no estructurado, datos estructurados, etc.
  • Procesar solicitudes en tiempo real en producción usando modelos de AA más amplios y complejos como nunca antes.
Esperamos que TensorFlow Research Cloud permita a la mayor cantidad posible de investigadores explorar la frontera de la investigación en aprendizaje automático y ampliarla a nuevos descubrimientos. Te alentamos a que te registres hoy para estar entre los primeros en recibir más información ni bien esté disponible.



Ha sido un año interesante. En mayo, incluimos Firebase en nuestra plataforma de aplicaciones unificadas. Para ello, construimos sobre la plataforma original basada en back-end como un servicio y agregamos productos para ayudar a los programadores a expandir su base de usuarios activos, como también probar y monetizar sus aplicaciones. Enterarnos sobre programadores como los que crearon Wattpad, que compilaron una aplicación con Firebase en solo tres semanas, hace que todo el esfuerzo sea merecido.


Ha sido un año interesante. En mayo, incluimos Firebase en nuestra plataforma de aplicaciones unificadas. Para ello, construimos sobre la plataforma original basada en back-end como un servicio y agregamos productos para ayudar a los programadores a expandir su base de usuarios activos, como también probar y monetizar sus aplicaciones. Enterarnos sobre programadores como los que crearon Wattpad, que compilaron una aplicación con Firebase en solo tres semanas, hace que todo el esfuerzo sea merecido.
Nos entusiasma la respuesta inicial de la comunidad, pero creemos que nuestro viaje recién está comenzando. Hablemos sobre algunas de las últimas mejoras que se aplican a Firebase.

Integración con Fabric

En enero, anunciamos la bienvenida del equipo Fabric a Firebase. Al principio, Fabric captó nuestra atención con su gama de productos, como la herramienta de informe de fallos líder en el sector, Crashlytics. A medida que conocimos mejor al equipo, nos sorprendió aun más la similitud de nuestras misiones: ayudar a los programadores a compilar mejores aplicaciones y lograr el crecimiento de empresas exitosas. En los últimos meses, trabajamos estrechamente con el equipo Fabric para unificar lo mejor de nuestras plataformas.
Planeamos convertir a Crashlytics en el producto principal de informe de fallos en Firebase. Si todavía no usas una herramienta de informe de fallos, te recomendamos que pruebes Crashlytics para que descubras lo que puede hacer por ti. Puedes comenzar siguiendo la documentación de Fabric.

La autenticación telefónica llega a Firebase

La autenticación de números telefónicos ha sido la función más solicitada para la Autenticación de Firebase, por lo que nos enorgullece anunciar que hemos trabajado con el equipo Fabric Digits para incorporar la autenticación telefónica en nuestra plataforma. Ahora puedes hacer que los usuarios accedan con su número telefónico, además del uso tradicional del correo electrónico/contraseña o los proveedores de identidad, como Google o Facebook. Esto te proporciona una solución integral de autenticación, independientemente de quiénes sean tus usuarios o cómo prefieran acceder.
Al mismo tiempo, el equipo Fabric, dejará de usar el nombre de Digits y su SDK. Si actualmente usas Digits, en las próximas semanas, implementaremos la capacidad de vincular tu cuenta actual de Digits con Firebase y pasar del SDK de Digits al SDK de Firebase. Ingresa al blog de Digits para obtener más información.

Presentación de Firebase Performance Monitoring

Entendemos que el rendimiento y la estabilidad deficientes de una app son los motivos principales por los que los usuarios dejan malas calificaciones en tu aplicación y tal vez los pierdas. Como parte de nuestro esfuerzo por ayudar a los programadores a compilar mejores aplicaciones, nos enorgullece anunciar el lanzamiento beta de Performance Monitoring.
Firebase Performance Monitoring es una herramienta nueva gratuita que te ayuda a comprender cuándo la experiencia del usuario resulta afectada por un código de rendimiento deficiente o condiciones de red problemáticas. Obtén más información y da tus primeros pasos con Performance Monitoring en la documentación de Firebase.

Análisis más sólidos

Analytics ha sido el centro de la plataforma de Firebase desde el lanzamiento de la última edición de I/O. Sabemos que comprender a tus usuarios es la mejor manera para que tu app sea exitosa, por lo que seguimos invirtiendo en mejorar nuestros productos de análisis.
Antes que nada, es posible que te llame la atención empezar a ver el nombre "Google Analytics for Firebase" en nuestra documentación. Desarrollamos nuestra solución de análisis junto con el equipo de Google Analytics, y los informes están disponibles en la Consola de Firebase y la interfaz de Google Analytics. Por esto, cambiamos el nombre Firebase Analytics por Google Analytics for Firebase, para reflejar que los datos de los análisis de tus aplicaciones se comparten entre ambas soluciones.
Para quienes monetizan su aplicación con AdMob, hemos comenzado a compartir los datos entre las dos plataformas, lo que te ayuda a comprender el verdadero valor de duración (LTV) de los usuarios, tanto en las compras como en las ganancias de AdMob. Verás estas estadísticas nuevas en el panel de control actualizado de Analytics.
Muchos programadores también han solicitado estadísticas de análisis en eventos y parámetros personalizados. A partir de hoy, pueden registrar hasta 50 parámetros de eventos personalizados y ver los detalles en los informes de Analytics. Obtén más información sobre los informes de parámetros personalizados.

Firebase para todos: iOS, juegos y código abierto

La misión de Firebase es ayudar a todos los programadores a compilar mejores aplicaciones. Animando a ese espíritu, hoy anunciamos una plataforma expandida y compatibilidad vertical para Firebase.
En primer lugar, como Swift se ha convertido en el lenguaje preferido de muchos programadores de iOS, actualizamos nuestro SDK para que pueda manejar los matices propios del lenguaje Swift, lo que convierte el desarrollo con Swift en una experiencia nativa en Firebase.
También mejoramos el Envío de mensajes a través de la nube de Firebase mediante la adición de la compatibilidad para la autenticación basada en tokens para APN y la simplificación de la lógica de conexión y registro en el SDK del cliente.
En segundo lugar, la comunidad de programadores nos hizo saber que una de las estadísticas más importantes que controlan son los fotogramas por segundo (FPS). Por ello, incorporamos compatibilidad con bucle de juego y control de FPS en Test Lab para Android, lo que te permite evaluar el índice de fotogramas del juego antes de implementarlo. Junto con la adición de complementos de Unity y un SDK en C++ (que anunciamos en la GDC este año), creemos que Firebase es una gran opción para los programadores de juegos. Para ver un ejemplo de un juego compilado en Firebase, consulta nuestra aplicación Mecha Hamster en Github.
Finalmente, dimos un gran primer paso hacia el lanzamiento en código abierto de nuestros SDK. Creemos en el software de código abierto, no solo porque la transparencia es una meta importante, sino también porque sabemos que la mayor innovación se genera cuando todos colaboramos. Puedes ver nuestros repositorios nuevos en nuestra página de proyectos de código abierto y obtener más información sobre nuestra decisión en esta entrada del blog.

Hosting dinámico con Cloud Functions for Firebase

En marzo, lanzamos Cloud Functions for Firebase, que permite ejecutar código back-end personalizado en respuesta a eventos activados por funciones de Firebase y solicitudes HTTP. Esto te permite hacer distintas cosas, como enviar una notificación cuando un usuario se registra o crear miniaturas automáticamente cuando se carga una imagen en Cloud Storage.
Hoy, con la intención atender mejor a la comunidad de programadores, ampliamos el Hosting de Firebase para integrarlo en Cloud Functions. Esto significa que, además de brindar recursos estáticos para tu aplicación web, ahora puedes brindar contenido dinámico, generado por Cloud Functions, mediante Hosting de Firebase. A quienes compilan aplicaciones web progresivas, Hosting de Firebase con Cloud Functions les permite trabajar sin servidores. Puedes obtener más información en nuestra documentación.

Programa Firebase Alpha y lo que viene

Nuestra meta es crear la mejor experiencia para programadores: productos fáciles de usar, una gran documentación y API intuitivas. Y el mejor recurso que tenemos para mejorar Firebase eres tú. Tus preguntas y comentarios nos motivan continuamente a mejorar Firebase.
Por eso, nos entusiasma anunciar el programa Firebase Alpha, donde tendrás la oportunidad de probar lo más novedoso de nuestros productos. Es posible que no todo sea perfecto (de hecho, podemos casi garantizar que no lo será), pero si participas en la comunidad Alpha, ayudarás a definir el futuro de Firebase. Si quieres formar parte, muéstranos tu interés en el formulario para Firebase Alpha.
Gracias por tu apoyo, entusiasmo y, más que nada, tus comentarios. La comunidad Firebase es el motivo por el que pudimos hacer crecer y mejorar nuestra plataforma a un ritmo increíble el año pasado. Nos emociona seguir trabajando contigo para compilar productos simples e intuitivos para el desarrollo de aplicaciones y el crecimiento de empresas móviles. Para dar los primeros pasos con Firebase hoy, visita nuestro sitio web recientemente renovado. Esperamos con entusiasmo ver tus compilaciones.

Estamos contentos de encontrarnos nuevamente en el patio de casa para la Google I/O para conectarnos con programadores de todo el mundo. Los 7200 asistentes en Shoreline Amphitheatre, los millones de espectadores de la ...
Estamos contentos de encontrarnos nuevamente en el patio de casa para la Google I/O para conectarnos con programadores de todo el mundo. Los 7200 asistentes en Shoreline Amphitheatre, los millones de espectadores de la transmisión en vivo y los miles de programadores en los eventos locales extendidos de I/O en más de 80 países se enteraron sobre nuestros esfuerzos para simplificar la vida de los programadores, al permitirles centrarse en los problemas que intentan resolver minimizando los puntos débiles de la compilación de un producto.

Al comenzar el día, nuestro director ejecutivo Sundar Pichai habló sobre nuestras diversas plataformas que utilizan miles de millones de usuarios. Así se trate de Android, Chrome o la Web móvil, nuestro éxito no hubiera sido posible sin la comunidad de programadores. Durante la presentación principal para programadores, abordamos nuestras importantes inversiones en herramientas y servicios para los programadores que utilizan nuestras plataformas todos los días.

Tenemos mucho que cubrir en los siguientes tres días. Veamos más de cerca las noticias más importantes de I/O para los desarrolladores:

Plataformas que conectan a los programadores con miles de millones de usuarios de todo el mundo

  • Android O Developer Preview 2: conozca más de cerca el siguiente lanzamiento de Android O que se basa en experiencias fluidas que aumentan la utilidad Android, y nuestros esfuerzos para optimizar la duración de la batería, el tiempo de inicio, el tiempo de visualización de gráficos y la estabilidad. Ahora, los usuarios principiantes pueden participar en el programa Android O Beta en android.com/beta y ejecutar Android O.
  • Project Treble: la semana pasada también presentamos un framework nuevo de Android diseñado para reducir el tiempo y el esfuerzo necesarios para que los fabricantes de dispositivos actualicen un teléfono a una versión nueva de Android, a partir de Android O.
  • Android Go: estamos optimizando Android para que se ejecute sin inconvenientes en dispositivos básicos, desde el lanzamiento de Android O. También estamos diseñando aplicaciones de Google para que usen menos cantidad de memoria, espacio de almacenamiento y datos móviles, incluidas aplicaciones como YouTube Go, Chrome y Gboard.
  • Kotlin: Android es compatible oficialmente con el lenguaje de programación Kotlin, además de los lenguajes Java y C++. Kotlin es un lenguaje con un diseño increíble, maduro y listo para salir a producción que creemos hará que el desarrollo de Android sea más rápido y divertido.
  • Android Studio 3.0 Canary: nuestra nueva preview incluye tres funciones principales para acelerar el flujo de desarrollo. Estas son un conjunto nuevo de herramientas para la generación de perfiles para el rendimiento de las aplicaciones a fin de diagnosticar rápidamente problemas de rendimiento, el soporte del lenguaje de programación Kotlin y una mayor velocidad de compilación de Gradle para proyectos con aplicaciones de gran tamaño.
  • Web móvil: AMP y Progressive Web App (PWA) están redefiniendo el desarrollo web móvil moderno. AMP presenta contenido a los usuarios con rapidez y los PWA brindan experiencias confiables, rápidas y atractivas centradas en las aplicaciones. Estamos viendo historias de éxito de todo el mundo: la compañía de viajes Wego implementó una exitosa PWA basada en AMP y Forbes ha incrementado la participación de los usuarios desde el lanzamiento de una PWA. Si te preguntas qué tan buena es tu experiencia web actual, puedes usar Lighthouse, una herramienta automatizada que mide la calidad de las páginas web. Asegúrate de sumarte esta tarde a la charla Web móvil: estado de la unión para conocer más sobre el desarrollo de experiencias web móviles completas.

Infraestructura y servicios para llevar las apps para dispositivos móviles y la Web al siguiente nivel

  • Firebase: en la edición del año pasado de I/O, ampliamos Firebase a una plataforma de desarrollo móvil completa con productos que te ayudan a compilar tu aplicación y hacer crecer tu empresa. Más de un millón de programadores ahora usan Firebase, y estamos duplicando nuestros esfuerzos para simplificar más los desafíos que los programadores enfrentan cada día. Proporcionamos más estadísticas para comprender el rendimiento de las aplicaciones con Firebase Performance Monitoring, mediante la introducción de la integración entre Hosting y Cloud Functions, la adición de la compatibilidad con la autenticación de números telefónicos y el mejoramiento de Analytics de diversas maneras. También comenzamos a lanzar en código abierto nuestros SDK.
  • Certificaciones para programadores de la Web móvil: en I/O 2016, lanzamos la Associate Android Developer Certification. Este año, sumamos dos certificaciones nuevas para programadores web: la Mobile Sites Certification y la Mobile Web Specialist Certification.

Herramientas potentes para atraer usuarios nuevos y lograr el crecimiento de empresas exitosas

  • Google Play Console: anunciamos varios informes y funciones nuevos y potentes en la Play Console para ayudar a los programadores a mejorar el rendimiento de las aplicaciones, administrar los lanzamientos con confianza, llegar a un público mundial y lograr el crecimiento de sus empresas. Play Console también tiene un nombre nuevo, que refleja sus usos empresariales ampliados, y una apariencia renovada para facilitar la realización de las tareas.
  • Apps instantáneas Android: abrimos la posibilidad de que todos los programadores utilicen Apps instantáneas Android, una manera nueva de ejecutar las aplicaciones de Android sin instalarlas. Ahora todos pueden compilar y publicar una aplicación instantánea. También se ofrecen más de 50 experiencias nuevas disponibles para que los usuarios prueben diversas marcas, como Jet, New York Times, Vimeo y Zillow.
  • Pagos, monetización y publicidad: incorporamos la Google Payment API que permite a los programadores dar a los clientes la posibilidad de pagar desde aplicaciones y la Web con tarjetas de crédito o débito guardadas en sus cuenta de Google. La nueva integración de AdMob en Google Analytics para Firebase los ayuda a monetizar eficientemente, y las actualizaciones de las campañas universales de aplicaciones los ayudarán a aumentar su base de usuarios activos.

Interfaces nuevas para desafiar los límites de lo factible

  • Acciones en Google para Google Assistant: llevamos las Acciones de Google a los teléfonos, incorporamos funciones y funcionalidades nuevas, mejoramos nuestro SDK y más. También lanzamos Actions Console, una consola nueva para programadores que ayuda a los programadores a trabajar en equipo, y a recolectar datos sobre el uso, el rendimiento y los patrones de descubrimiento de usuarios de las aplicaciones. Esta consola nueva está integrada en las consolas de Firebase y Google Cloud.
  • RV y RA en Google: tendremos más para compartir sobre las funciones de la plataforma y las herramientas para programadores del Protector de pantalla interactivo durante la sesión “VR and AR at Google” de mañana (18 de mayo), a las 9:30 AM PT, en el Amphitheatre, que se transmitirá en vivo.

Es importante para nosotros que los programadores logren el éxito. Además de desarrollar productos que ayudan a resolver los problemas de los programadores, estamos presentes en más de 130 países y expandimos e hicimos crecer la comunidad de programadores mediante programas como Women Techmakers y Google Developer Groups (GDG). También estamos investigando programas de capacitación, como la Google Developers Certification, y cursos a través de Udacity y otros socios para ayudar a los programadores a profundizar su capacidad técnica. Además, nos emociona anunciar dos grandes jornadas para programadores de varios productos, los Google Developer Days, que se realizarán en Europa (septiembre de 2017 en Cracovia, Polonia) y en India (diciembre de 2017 en Bangalore, India). Si te interesa obtener más información, regístrate para recibir actualizaciones en g.co/gdd2017.

Durante la Google I/O, los asistentes y los espectadores tienen la oportunidad de profundizar en varios campos con 14 temas de contenido y más de 140 sesiones grupales (que abarcan de Android a Assistant y RV); todo transmitido en vivo. También lanzamos más de 70 laboratorios de código para que los programadores estén listos para usar nuestras últimas API hoy mismo.

Así se trate de Android, Chrome, Play, RV/RA, la Cloud y la Web móvil, invertimos de forma constante en plataformas que conectan a los programadores con miles de millones de usuarios de todo el mundo. Agradecemos al apoyo continuo y los comentarios de la comunidad de programadores.


De tanto en tanto, es posible que experimentes en tus apps problemas relacionados con políticas de Google Play. El equipo de políticas de Google Play ha trabajado con mucho empeño a fin de proporcionarte los recursos y la asistencia que necesitas para resolver inconvenientes de esta clase.

De tanto en tanto, es posible que experimentes en tus apps problemas relacionados con políticas de Google Play. El equipo de políticas de Google Play ha trabajado con mucho empeño a fin de proporcionarte los recursos y la asistencia que necesitas para resolver inconvenientes de esta clase.

Si el equipo de revisión de apps detecta en tu app o en una actualización de esta un problema vinculado a políticas, recibirás un mensaje de correo electrónico con el asunto “Notification from Google Play”. (Si esto no sucede, asegúrate de actualizar tu dirección de correo electrónico en la página de detalles de la cuenta de tu consola del desarrollador).

En el mensaje de correo electrónico de políticas se incluirán la política que tu app haya infringido y los pasos que deberás seguir para resolver el problema. Si tu app es rechazada, puedes corregir el error y enviarla para que se someta a otra revisión. No será necesario que contactes al equipo de asistencia.

Si no estás de acuerdo respecto del supuesto incumplimiento de una política, o si deseas recibir ayuda para resolver un problema relacionado, puedes contactar en cualquier momento a nuestro equipo de asistencia. Simplemente usa la información de contacto del mensaje de correo electrónico de notificación o haz clic en el signo de interrogación de la parte inferior de cada página del Centro de políticas para desarrolladores.





Para obtener respuestas en el menor tiempo posible, asegúrate de incluir tu nombre de paquete. No bien envíes el formulario, recibirás una respuesta automática que incluirá el número de caso en el asunto. Esto significa que el envío de tu pedido fue exitoso. Un especialista revisará tu caso y te enviará una respuesta en un plazo de hasta 72 horas.

Si deseas obtener más información sobre políticas de Google Play, mira el video “10 consejos para cumplir con la política de Google Play” en el canal de YouTube para desarrolladores de Android o a continuación.



Hasta la próxima entrega, permanece atento a las novedades de AdMob siguiendo nuestras páginas de Twitter, LinkedIn y Google+.

Publicado por Chris Jones, equipo social, AdMob.


Publicado por Chad Brubaker, Equipo de seguridad de Android


En Android Nougat (7.0), hemos modificado la manera en que Android maneja las entidades de certificación de confianza (CA) a fin de ofrecer parámetros predeterminados más seguros para el tráfico de las aplicaciones. La mayoría de las aplicaciones y los usuarios no deberían verse afectados por estos cambios. Tampoco es necesario tomar medidas. Entre los cambios se incluye lo siguiente ...

Publicado por Chad Brubaker, Equipo de seguridad de Android


En Android Nougat (7.0), hemos modificado la manera en que Android maneja las entidades de certificación de confianza (CA) a fin de ofrecer parámetros predeterminados más seguros para el tráfico de las aplicaciones. La mayoría de las aplicaciones y los usuarios no deberían verse afectados por estos cambios. Tampoco es necesario tomar medidas. Entre los cambios se incluye lo siguiente:
  • API seguras y sencillas para admitir CA personalizadas.
  • De forma predeterminada, ya no es necesario que las aplicaciones orientadas al nivel de API 24 y a niveles posteriores admitan CA agregados por usuarios o administradores para conexiones seguras.
  • Todos los dispositivos con Android Nougat ofrecen el mismo conjunto estandarizado de CA de sistema, no existen personalizaciones específicas según el dispositivo.

Continúa leyendo si deseas obtener más información sobre estos cambios y lo que se debe hacer si te afectan ellos.

API seguras y sencillas


Las aplicaciones siempre pudieron establecer de forma personalizada las entidades de certificación que admiten. Sin embargo, hemos visto que en algunas de ellas se producen errores debido a las complejidades de las API de seguridad de la capa de transporte (TLS) de Java. Para corregir esto, mejoramos las API a fin de personalizar la confianza.

CA agregadas por usuarios


Proteger todos los datos de las aplicaciones es uno de los objetivos claves del espacio de aplicaciones de Android. Android Nougat cambia la manera en que las aplicaciones interactúan con CA suministradas por administradores. De forma predeterminada, en las aplicaciones orientadas al nivel de API 24, por diseño, no se tendrán en cuenta tales CA a menos que lo hagan de forma explícita. Esta configuración segura de forma predeterminada reduce la superficie de ataque de las aplicaciones e impulsa el manejo uniforme de datos de aplicaciones basados en archivos.

Personalización de las CA de confianza


Personalizar CA de confianza para tu aplicación en Android es sencillo a través de la configuración de seguridad de red. Según sea necesario, la confianza se puede especificar en toda la aplicación o solo para conexiones con ciertos dominios. A continuación, se ofrecen algunos ejemplos para admitir una CA personalizada o agregada por los usuarios, además de las CA de sistema. Para hallar más ejemplos e información, consulta la documentación completa.

Admisión de CA personalizadas para depuración


A fin de permitir que tu aplicación admita CA personalizadas únicamente para depuraciones locales, incluye algo como lo siguiente en tu configuración de seguridad de red. Las CA solo serán de confianza mientras tu aplicación se marque como depurable.
<network-security-config>  
      <debug-overrides>  
           <trust-anchors>  
                <!-- Trust user added CAs while debuggable only -->
                <certificates src="user" />  
           </trust-anchors>  
      </domain-config>  
 </network-security-config>

Admisión de CA personalizadas para un dominio


A fin de permitir que tu aplicación admita CA personalizadas para un dominio específico, incluye algo como lo siguiente en tu configuración de seguridad de red.
<network-security-config>  
      <domain-config>  
           <domain includeSubdomains="true">internal.example.com</domain>  
           <trust-anchors>  
                <!-- Only trust the CAs included with the app  
                     for connections to internal.example.com -->  
                <certificates src="@raw/cas" />  
           </trust-anchors>  
      </domain-config>  
 </network-security-config>

Admisión de CA agregadas por usuarios para determinados dominios


A fin de permitir que tu aplicación admita CA personalizadas para varios dominios, incluye algo como lo siguiente en tu configuración de seguridad de red.
<network-security-config>  
      <domain-config>  
           <domain includeSubdomains="true">userCaDomain.com</domain>  
           <domain includeSubdomains="true">otherUserCaDomain.com</domain>  
           <trust-anchors>  
                  <!-- Trust preinstalled CAs -->  
                  <certificates src="system" />  
                  <!-- Additionally trust user added CAs -->  
                  <certificates src="user" />  
           </trust-anchors>  
      </domain-config>  
 </network-security-config>

Admisión de CA agregadas por usuarios para casi todos los dominios


A fin de permitir que tu aplicación admita CA personalizadas para todos los dominios, a excepción de los que se especifiquen, incluye algo como lo siguiente en tu configuración de seguridad de red.
<network-security-config>  
      <base-config>  
           <trust-anchors>  
                <!-- Trust preinstalled CAs -->  
                <certificates src="system" />  
                <!-- Additionally trust user added CAs -->  
                <certificates src="user" />  
           </trust-anchors>  
      </base-config>  
      <domain-config>  
           <domain includeSubdomains="true">sensitive.example.com</domain>  
           <trust-anchors>  
                <!-- Only allow sensitive content to be exchanged  
             with the real server and not any user or  
    admin configured MiTMs -->  
                <certificates src="system" />  
           <trust-anchors>  
      </domain-config>  
 </network-security-config>

Admisión de CA agregadas por usuarios para todas las conexiones seguras


A fin de permitir que tu aplicación admita CA agregadas por usuarios para todas las conexiones seguras, incluye lo siguiente en tu configuración de seguridad de red.
<network-security-config>  
      <base-config>  
            <trust-anchors>  
                <!-- Trust preinstalled CAs -->  
                <certificates src="system" />  
                <!-- Additionally trust user added CAs -->  
                <certificates src="user" />  
           </trust-anchors>  
      </base-config>  
 </network-security-config>

Conjunto estandarizado de CA de confianza del sistema


Para brindar una experiencia más uniforme y segura en el ecosistema de Android, a partir de Android Nougat, los dispositivos compatibles admitirán únicamente las CA de sistema estandarizadas de AOSP.

Antes, el conjunto de CA preinstaladas que se incluían en el sistema podían variar de un dispositivo a otro. Esto podía generar problemas de incompatibilidad si en algunos dispositivos no se incluían las CA que necesitaban las aplicaciones para las conexiones, y también problemas de seguridad si se incluían CA que no cumplieran con nuestros requisitos de seguridad en algunos dispositivos.

¿Qué sucede si cuento con una CA que a mi entender debe incluirse en Android?


En primer lugar, asegúrate de que tu CA deba incluirse en el sistema. Las CA preinstaladas solo son para CA que cumplan con nuestros requisitos de seguridad, ya que afectan las conexiones seguras de la mayoría de las aplicaciones en el dispositivo. Si necesitas agregar una CA para la conexión con hosts que la usen, como alternativa debes personalizar entre tus aplicaciones y servicios aquellos que se conecten a dichos hosts. Para obtener más información, consulta la sección Personalización de las CA de confianza que se encuentra arriba.

Si usas una CA que, según tu parecer, debería incluirse en Android, primero completa el proceso de inclusión de CA de Mozilla y luego presenta una solicitud de función en Android para que se agregue la CA al conjunto estandarizado de CA de sistema.

ACTUALIZACIÓN: actualizamos este tutorial para el Firebase 3.1.0 SDK, que ahora admite la base de datos en tiempo real y la autenticación de Firebase.

En Firebase, somos grandes seguidores de React ...
ACTUALIZACIÓN: actualizamos este tutorial para el Firebase 3.1.0 SDK, que ahora admite la base de datos en tiempo real y la autenticación de Firebase.

En Firebase, somos grandes seguidores de React. Firebase sincroniza el estado de las aplicaciones y React representa nuevamente la IU de estas según los cambios de estado. Es un complemento perfecto.

Con React Native, el desarrollo de aplicaciones se convirtió en un proceso mucho más sencillo para los desarrolladores de JavaScript. Gracias a React Native, puedes crear aplicaciones nativas reales usando únicamente JavaScript. Eso es asombroso. Vivimos en el futuro. Comencemos.

Configuración


Si deseas ir directamente al código, puedes visitar el repositorio definitivo de GitHub aquí. Si no, veamos el proceso paso a paso.

Dar los primeros pasos con React Native es bastante sencillo, pero existen algunos aspectos que deberías conocer. Si ya cuentas con React Native, puedes omitir esta sección.

En primer lugar, necesitarás Homebrew, que es fácil de instalar. También necesitarás Node.js 4.0 o versiones posteriores. El equipo de React Native recomienda usar nvm para administrar las versiones de tus nodos (yo también)..

Una vez instaladas esas herramientas, ejecuta los siguientes comandos:
brew install watchman
npm install -g react-native-cli

Por último, podrás iniciar tu proyecto con el comando de CLI:
react-native init GroceryApp # or whatever you want

Abre la carpeta principal en tu editor favorito.
atom GroceryApp # if you’re into Atom

Compilación y ejecución


Para compilar un proyecto de React Native, ejecuta el siguiente comando:
react-native run-ios

Con esto deberá iniciarse el simulador y verás la pantalla de código estándar.

Aplicación en blanco


React Native viene con recarga directa. Esto significa que puedes editar el código, index.ios.js, y luego seleccionar Cmd+R para ver al instante una actualización con los cambios incluidos. Si eres desarrollador de iOS o, de hecho, de cualquier plataforma, sabrás cuán positivo es esto.

Una vez configurada la compilación, pondremos Firebase en funcionamiento.

Configuración de Firebase


React Native administra dependencias a través de npm. Para instalar Firebase, ejecuta el siguiente comando en la raíz del proyecto.
npm install firebase --save

Abre index.ios.js y agrega la siguiente línea en la parte superior:
import * as firebase from 'firebase';

Luego, encima del componente, inicializa Firebase con tus valores de configuración:
// Initialize Firebase
const firebaseConfig = {
  apiKey: "<your-api-key>",
  authDomain: "<your-auth-domain>",
  databaseURL: "<your-database-url>",
  storageBucket: "<your-storage-bucket>",,
};
const firebaseApp = firebase.initializeApp(firebaseConfig);

¿Qué es un elemento const? Un elemento const es una referencia de solo lectura a un valor, lo cual tiene sentido aquí porque no deseas sobrescribir nunca el valor de Firebase. Debido a que usas Node 4.0 o una versión posterior, puedes emplear esta palabra clave. Si tu editor se vuelve loco, te mentirá.

Con una función de ES2015 no es suficiente. En lugar de usar React.createClass() para definir componentes, usaremos clases.

Componentes de ES2015 (ES6)


React se basa en componentes. Esto significa que una aplicación consiste simplemente en un árbol con componentes que parte de un componente raíz. A partir de React 0.14, puedes usar clases de ES2015 para definir componentes de React.

En index.ios.js, cambiaremos el componente para usar una clase en lugar de React.createClass().
class GroceryApp extends Component {
  render() {
    return (
      <View style="{styles.container}">

      </View>
    );
  }
}

¿Por qué clases de ES2015 en lugar de React.createClass()? Aunque el asunto suscita importantes debates, todo se resume a una cuestión de gusto.

El shell de la aplicación quedará así completo. Haremos que se vea bien o, al menos, medianamente decente.

Estilos en React Native


En React Native se usa JavaScript en lugar de hojas de estilos en cascada (CSS) para los estilos. Esto puede dar la impresión de una divergencia extrema, pero en realidad no es tan así. Para declarar un conjunto de estilos, crea un elemento StyleSheet.
var styles = StyleSheet.create({
  container: {
    backgroundColor: '#f2f2f2',
    flex: 1,
  },
});

Un elemento StyleSheet contiene un conjunto de objetos que representan estilos similares a los de CSS. Luego usa estos estilos en un componente de React:
<View style="{styles.container}">
  I’m a container lol!
</View>

Por lo tanto, no deberás preocuparte por la posibilidad de perder tus capacidades de CSS. En todo caso, te convendrá aprender sobre flexbox de CSS para agilizar mucho el manejo de estilos en React Native.

Ahora que eres un profesional de los estilos en React, declararemos los estilos para la aplicación.

Adición de estilos


Crea un archivo con el nombre styles.js y agrega el siguiente código de este archivo. Estos serán los estilos que usaremos para la aplicación.

Observarás que en React Native se usan módulos CommonJS. En la parte inferior de styles.js, StyleSheet se exporta usando module.exports.

Esto te permitirá importar estos estilos usando require(). Abre index.ios.js y agrega la siguiente línea de código:
const styles = require('./styles.js')

Asegúrate de eliminar la variable de estilos de la parte inferior del archivo.

De esta manera, los estilos quedarán listos. Veamos la estructura de componentes de la aplicación.

Desglose de la IU en una jerarquía de componentes


El mejor consejo que leí sobre el uso de React es el de comenzar por desglosar la UI en una jerarquía de componentes. A continuación, se ofrece una descripción de la jerarquía de componentes de la aplicación.

Jerarquía de componentes


La aplicación consta de cinco componentes:
  1. GroceryApp (naranja): contiene toda la aplicación.
  2. StatusBar (púrpura): muestra el título de la vista.
  3. ListView (verde): muestra la lista de artículos de supermercado.
  4. ListItem (negro): muestra un elemento individual de la lista.
  5. ActionButton (azul): agrega un elemento a la lista.

Crea una carpeta llamada components. Cada uno de estos componentes se almacena en la carpeta de componentes. GroceryApp es la excepción, ya que está contenido en index.ios.js.

Agrega cada uno de los siguientes componentes a la carpeta components:

ActionButton.js
'use strict';

import React, {Component} from 'react';
import ReactNative from 'react-native';
const styles = require('../styles.js')
const constants = styles.constants;
const { StyleSheet, Text, View, TouchableHighlight} = ReactNative;

class ActionButton extends Component {
  render() {
    return (
      <View style={styles.action}>
        <TouchableHighlight
          underlayColor={constants.actionColor}
          onPress={this.props.onPress}>
          <Text style={styles.actionText}>{this.props.title}</Text>
        </TouchableHighlight>
      </View>
    );
  }
}

module.exports = ActionButton;

ListItem.js
import React, {Component} from 'react';
import ReactNative from 'react-native';
const styles = require('../styles.js')
const { View, TouchableHighlight, Text } = ReactNative;

class ListItem extends Component {
  render() {
    return (
      <TouchableHighlight onPress={this.props.onPress}>
        <View style={styles.li}>
          <Text style={styles.liText}>{this.props.item.title}</Text>
        </View>
      </TouchableHighlight>
    );
  }
}

module.exports = ListItem;

StatusBar.js
'use strict';
import React, {Component} from 'react';
import ReactNative from 'react-native';
const styles = require('../styles.js')
const { StyleSheet, Text, View} = ReactNative;

class StatusBar extends Component {
  render() {
    return (
      <View>
        <View style={styles.statusbar}/>
        <View style={styles.navbar}>
          <Text style={styles.navbarTitle}>{this.props.title}</Text>
        </View>
      </View>
    );
  }
}

module.exports = StatusBar;

Una vez agregados los componentes, haremos una versión estática de la aplicación.

Prototipo estático


En index.ios.js, agrega las siguientes importaciones a la parte superior de la página:
import React, {Component} from 'react';
import ReactNative from 'react-native';
import * as firebase from 'firebase';
const StatusBar = require('./components/StatusBar');
const ActionButton = require('./components/ActionButton');
const ListItem = require('./components/ListItem');
const styles = require('./styles.js');

Luego agrega el siguiente snippet de código:
_renderItem(item) {
    return (
      <ListItem item="{item}" onpress="{()" ==""> {}} />
    );
  }

  render() {
    return (
      <View style="{styles.container}">

        <StatusBar title="Grocery List">

        <ListView datasource="{this.state.dataSource}" renderrow="{this._renderItem.bind(this)}" style="{styles.listview}/">

        <ActionButton title="Add" onpress="{()" ==""> {}} />

      </View>
    );
  }

La función render() es la vista principal de la aplicación y _renderItem() establece los elementos individuales de la lista.

Luego crea un constructor para el componente raíz, GroceryApp.
constructor(props) {
  super(props);
  this.state = {
    dataSource: new ListView.DataSource({
      rowHasChanged: (row1, row2) => row1 !== row2,
    })
  };
}

El componente tiene una propiedad especial llamada state, que administra todo el flujo de datos de la aplicación. Veremos esto en mayor profundidad en la sección siguiente.

El estado de la aplicación es un elemento ListView.DataSource, una clase que proporciona procesamiento eficaz de datos a un componente ListView. El siguiente paso consiste en mostrar estos datos.

Cada componente tiene un ciclo de vida en el cual se llama a determinadas funciones ante eventos importantes. Cuando un componente se representa por primera vez, se llama a componentDidMount(). Aquí conviene configurar cualquier estado inicial de la aplicación.
componentDidMount() {
    this.setState({
      dataSource: this.state.dataSource.cloneWithRows([{ title: 'Pizza' }])
    })
  }

Tras crear y ejecutar la aplicación, verás la siguiente aplicación estática.




Cada uno de estos componentes simplemente muestra datos o fija una función de callback para un toque.

El aspecto clave que debes comprender es que estos componentes no tienen estado. Tienen propiedades que se fijan a través de sus componentes raíces, GroceryApp. Para comenzar a comprender React, debes aprender a administrar el estado.

Estado


El estado simplemente consiste en datos que pueden modificarse. Se denomina “estado” a estos datos porque representan el estado de tu aplicación. Si estos datos cambian, es probable que lo mismo suceda con el aspecto de tu aplicación y que, por lo tanto, su “estado” sea diferente. El estado generalmente abarca aspectos como una lista de tareas o un botón de habilitación o inhabilitación.

El componente raíz servirá como portador del estado. Los cambios de estado comienzan en el componente raíz, que luego debe actualizar las propiedades de sus componentes secundarios.

Las propiedades de los componentes son inmutables. Esto significa que no pueden modificarse. Por lo tanto, si no es posible modificar las propiedades... ¿cómo es posible que cambien? Se debe representar de nuevo la aplicación llamando a setState(), como se observa en componentDidMount().

La función setState() es especial porque cada vez reciba llamadas intentará volver a representar por completo la aplicación. Esto significa que si la propiedad de un campo secundario es diferente respecto del último estado, se volverá a representar con el nuevo valor.

Aquí es donde React se combina con Firebase a la perfección. Porque la base de datos de Firebase sincroniza estados de las aplicaciones en varios dispositivos y React vuelve a representar con eficacia cambios de estado de las aplicaciones.

Receptor de la base de datos en tiempo real


Crea la referencia de la base de datos en tiempo real como una propiedad en el constructor:
this.itemsRef = firebaseApp.database().ref();

Luego agrega la siguiente función al componente GroceryApp:
listenForItems(itemsRef) {
    itemsRef.on('value', (snap) => {

      // get children as an array
      var items = [];
      snap.forEach((child) => {
        items.push({
          title: child.val().title,
          _key: child.key
        });
      });

      this.setState({
        dataSource: this.state.dataSource.cloneWithRows(items)
      });

    });
  }

Esta función crea un receptor de valores para todos los artículos de supermercado. Cuando se agregue, modifique o elimine un artículo, obtendrás de nuevo el conjunto de resultados completo, bajo la forma de un elemento DataSnapshot, a través del Firebase SDK. Usando DataSnapshot, debes llamar a forEach(child), que se itera en todos los campos secundarios y los agrega a un arreglo como un artículos de supermercado. Observarás que en la función .forEach se crea una propiedad _key a partir del valor .key() de DataSnapshot. Esto simplificará mucho las operaciones de datos posteriormente.

Una vez que se complete el arreglo, actualizarás la propiedad dataSource en el estado usando dataSource.cloneWithRows(items). La función cloneWithRows() es simplemente un método práctico para crear un nuevo elemento ListView.DataSource basado en el mismo elemento DataSource definido previamente.

Luego, escribirás el elemento componentDidMount() de límite de la recepción:
componentDidMount() {
    this.listenForItems(this.itemsRef);
  }

Compila y ejecuta la app. Aparecerá una página vacía, pero puedes intentar agregar algunos elementos usando el panel de aplicaciones de Firebase o el superfabuloso visor de datos Vulcan. ¡Verás la página actualizarse en tiempo real!

Vulcan


Esto es increíble. Sin embargo, asegúrate de que el botón “Add” funcione. Veremos eso en la sección que sigue.

Adición de artículos


Al tocar ActionButton, aparecerá una alerta con la cual se solicitará al usuario ingresar un artículo. Usarás la API AlertIOS para crear este cuadro de alerta.

Adición eventos


Agrega la siguiente función al componente GroceryApp:
_addItem() {
    AlertIOS.prompt(
      'Add New Item',
      null,
      [
        {
          text: 'Add',
          onPress: (text) => {
            this.itemsRef.push({ title: text })
          }
        },
      ],
      'plain-text'
    );
  }

A la hora de crear alertas, la API AlertIOS ofrece bastante extensibilidad. Los primeros dos parámetros son simples. Solo representan el cuadro de alerta y un mensaje opcional. El tercer parámetro es la esencia de la API. Aquí, podrás crear un arreglo que especifique los botones disponibles para el usuario. Cada botón puede tener un elemento text y style, y una función de callback onPress. El último parámetro es el tipo de entrada, independientemente que sea plain-text o secure-text.

Para agregar un artículo, crea un objeto en el arreglo de botones. Este objeto puede agregar artículos en el callback de onPress. El callback devuelve el texto que el usuario introduce. Usa este texto para .push() un nuevo campo secundario en la ubicación de /items.

Luego, deberás actualizar render() para asignar la propiedad onPress de ActionButton:
<ActionButton title="Add" onpress="{this._addItem.bind(this)}">
</ActionButton>

Realiza la compilación y ejecuta la aplicación. Cuando toques el botón “Add” e introduzcas un título de artículo, verás la actualización en la lista.

Genial, pero... ¿en qué clase de lista de supermercado no se completan los artículos?

Compleción de artículos


El usuario puede completar un artículo tocándolo para que se abra un cuadro de alerta. Si presiona la opción “Complete”, puedes borrarla de la lista.

Modifica _renderItem(item) para incluir un callback onPress:
_renderItem(item) {

    const onPress = () => {
      AlertIOS.prompt(
        'Complete',
        null,
        [
          {text: 'Complete', onPress: (text) => this.itemsRef.child(item._key).remove()},
          {text: 'Cancel', onPress: (text) => console.log('Cancel')}
        ],
        'default'
      );
    };

    return (
      <ListItem item="{item}" onpress="{onPress}">
    );
  }

Para “completar” un artículo, deberás eliminarlo de la base de datos de Firebase. Usando .child(key), puedes inspeccionar un artículo específico de la lista. El callback de onPress es un cierre. Por lo tanto, tiene acceso al entorno externo que contiene el parámetro item. En este punto, resulta práctica la propiedad _key.

Cuando se toca la opción “Completar”, puedes encontrar el campo secundario usando la propiedad _key en item. Luego, puedes llamar a .remove() para eliminar el artículo en la base de datos Firebase.

Realiza la compilación y ejecuta la aplicación de nuevo. Toca cualquier ListItem y luego “Completar”. Con esto, lo verás desaparecer de la lista.

Obtén el código y deja una estrella


Verifica la aplicación completa en Github. También agradeceremos muchísimo de tu parte la generosidad de colaborar con una estrella. Si lo deseas, puedes bifurcar el repositorio e incluso enviar un RP.

¿Aún tienes dificultades?


Si experimentas problemas, inicia una consulta en Stackoverflow. Verificaremos la etiqueta de Firebase en detalle o dejaremos comentarios en el Slack Team de la comunidad.





Para maximizar el potencial de ingresos de tu app, te convendrá verificar que tu app cumpla con las políticas de Google Play. Si sucede lo contrario, es posible que se inhabilite el servicio de anuncios. Por ello, te recomendamos consultar de manera regular las actualizaciones de políticas.

Para maximizar el potencial de ingresos de tu app, te convendrá verificar que tu app cumpla con las políticas de Google Play. Si sucede lo contrario, es posible que se inhabilite el servicio de anuncios. Por ello, te recomendamos consultar de manera regular las actualizaciones de políticas.

A principios de este año, se lanzó el Centro de Políticas de Desarrolladores (en play.google.com/policy). En este, se incluye lo siguiente:
  • Políticas organizadas por temas, como Monetización y anuncios, Privacidad y seguridad, Contenido restringido.
  • Indicaciones detalladas y ejemplos visuales relacionados con los incumplimientos más comunes.
  • Un diseño simplificado para ayudarte a lograr una navegación más intuitiva en dispositivos móviles o de escritorio.
  • Una sección Actualizaciones, que te permitirá estar al tanto de las incorporaciones recientes a la política de Google Play. 

Puedes seleccionar una política específica para obtener más información sobre ella.

Mantente conectado para obtener más información sobre prácticas recomendadas vinculadas a las políticas. Publicaremos un video corto en el que se resaltarán 10 consejos para cumplir con la política de Google Play.

Hasta la próxima entrega, permanece atento a las actualizaciones de AdMob siguiendo nuestras páginas de Twitter, LinkedIn y Google+.

Publicado por Chris Jones, Equipo social, AdMob.

Publicado originalmente en el blog de Google Cloud Platform

En la edición de mayo de Google I/O, Firebase anunció ...
 Publicado originalmente en el blog de Google Cloud Platform

En la edición de mayo de Google I/O, Firebase anunció un nuevo conjunto de productos para ayudar a los desarrolladores a crear apps para dispositivos móviles. Firebase Analytics, una de las partes que integran la nueva plataforma de Firebase, es una herramienta que captura automáticamente datos relacionados con la manera en que las personas usan tu app de iOS y Android, y te permite definir tus propios eventos de apps personalizados. Cuando se capturan los datos, quedan disponibles a través de un panel de control en la consola de Firebase. Una de las integraciones que prefiero de la nube de la plataforma de Firebase se relaciona con la capacidad de exportar datos sin procesar de Firebase Analytics a Google BigQuery para análisis personalizado. Este análisis personalizado es particularmente útil para agregar datos de las versiones de iOS y Android de tu app, y también para acceder a parámetros personalizados transmitidos en tus eventos de Firebase Analytics. Veamos lo que puedes hacer con esta poderosa combinación:

¿Cómo funciona la exportación de BigQuery?


Después de vincular tu proyecto de Firebase a BigQuery, Firebase exporta de manera automática una nueva tabla a un conjunto de datos asociado de BigQuery a diario. Si dispones de versiones de iOS y Android de tu app, Firebase exporta los datos para cada plataforma a un conjunto de datos separado. Cada tabla contiene los datos de actividad y demográficos del usuario, automáticamente capturados por Firebase Analytics, y los eventos personalizados que captures en tu app. De esta manera, después de exportar los datos de una semana de una app multiplataforma, tu proyecto de BigQuery contendría dos conjuntos de datos y cada uno de ellos tendría siete tablas:


Cómo explorar los datos


El esquema para cada tabla de exportación de Firebase Analytics es el mismo, y hemos creado dos conjuntos de datos (uno para iOS y uno para Android) con información de ejemplo sobre usuarios para que ejecutes los ejemplos de consulta siguientes. Los conjuntos de datos corresponden a un ejemplo de app de juego multiplataforma de iOS y Android. Cada conjunto de datos contiene siete tablas : los datos de análisis de una semana.

La siguiente consulta mostrará datos demográficos y de dispositivo de usuario básicos correspondientes a un día de uso en la versión de iOS de tu app:

SELECT
  user_dim.app_info.app_instance_id,
  user_dim.device_info.device_category,
  user_dim.device_info.user_default_language,
  user_dim.device_info.platform_version,
  user_dim.device_info.device_model,
  user_dim.geo_info.country,
  user_dim.geo_info.city,
  user_dim.app_info.app_version, 
  user_dim.app_info.app_store,
  user_dim.app_info.app_platform
FROM
  [firebase-analytics-sample-data:ios_dataset.app_events_20160601]

Debido a que el esquema para cada tabla de BigQuery exportada de Firebase Analytics es el mismo, puedes ejecutar cualquiera de las consultas de esta publicación en tus propios datos de Firebase Analytics reemplazando los nombres del conjunto de datos y de las tablas por los de tu proyecto.

El esquema tiene datos de usuario y datos de eventos. Firebase Analytics captura de manera automática todos los datos de usuario y los eventos personalizados que agregues a tu app completan los datos de eventos. Veamos los registros específicos de datos de usuario y de eventos.

Datos de usuario


Los registros de usuario contienen un ID de app único para cada usuario (user_dim.app_info.app_instance_id en el esquema) y datos sobre su ubicación, su dispositivo y la versión de su app. En la consola de Firebase, existen paneles de control separados para los análisis de Android e iOS de la app. Con BigQuery, se puede ejecutar una consulta para determinar los puntos del mundo desde los cuales los usuarios acceden a una app en ambas plataformas. En la consulta siguiente se emplea la función de unión de BigQuery, que te permite usar una coma como operador de UNION ALL. Debido a que en la tabla se crea una fila para cada paquete de eventos que un usuario activa, se usa EXACT_COUNT_DISTINCT a fin de garantizar que cada usuario solo se cuente una vez:
SELECT
  user_dim.geo_info.country as country,
  EXACT_COUNT_DISTINCT( user_dim.app_info.app_instance_id ) as users
FROM
  [firebase-analytics-sample-data:android_dataset.app_events_20160601],
  [firebase-analytics-sample-data:ios_dataset.app_events_20160601]
GROUP BY
  country
ORDER BY
  users DESC

Entre los datos de usuario, se incluye un registro user_properties, el cual contiene atributos que defines para describir segmentos de tu base de usuarios, como la preferencia de idioma o la ubicación geográfica. Firebase Analytics captura propiedades de usuario de manera predeterminada y puedes crear hasta 25 propias.

La preferencia de idioma de un usuario es una de las propiedades de usuario predeterminadas. Para ver los idiomas que nuestros usuarios hablan en las diferentes plataformas, se puede ejecutar la siguiente consulta:

SELECT
  user_dim.user_properties.value.value.string_value as language_code, 
  EXACT_COUNT_DISTINCT(user_dim.app_info.app_instance_id) as users,
FROM
  [firebase-analytics-sample-data:android_dataset.app_events_20160601],
  [firebase-analytics-sample-data:ios_dataset.app_events_20160601]
WHERE
  user_dim.user_properties.key = "language"
GROUP BY
  language_code
ORDER BY 
  users DESC

Datos de eventos


Firebase Analytics facilita el registro de eventos personalizados, como el seguimiento de compras de artículos o los clics en botones de tu app. Al registrar un evento, transmites su nombre y hasta 25 parámetros a Firebase Analytics, y en este último se realiza un seguimiento automático de las veces que dicho evento tuvo lugar. En la siguiente consulta se muestra la cantidad de veces que se produjo cada evento en la app en Android para un día determinado:

SELECT 
  event_dim.name,
  COUNT(event_dim.name) as event_count 
FROM
  [firebase-analytics-sample-data:android_dataset.app_events_20160601]
GROUP BY 
  event_dim.name
ORDER BY 
  event_count DESC

Si dispones de otro tipo de valor asociado con un evento (como precios de artículos), puedes pasarlo como parámetro de valor opcional y aplicar filtrado con él en BigQuery. En los ejemplos de tablas hay un evento spend_virtual_currency. Se puede escribir la siguiente consulta para ver la cantidad de moneda virtual que gastan los jugadores por vez:

SELECT 
  event_dim.params.value.int_value as virtual_currency_amt,
  COUNT(*) as num_times_spent
FROM
  [firebase-analytics-sample-data:android_dataset.app_events_20160601]
WHERE
  event_dim.name = "spend_virtual_currency"
AND
  event_dim.params.key = "value"
GROUP BY
  1
ORDER BY 
  num_times_spent DESC

Cómo crear consultas complejas


¿Qué sucede si uno desea ejecutar una consulta en ambas plataformas de su app para un período específico? Debido a que los datos de Firebase Analytics se dividen en tablas por cada día, esto se puede hacer mediante la función TABLE_DATE_RANGE de BigQuery. Esta consulta muestra un recuento de las ciudades de los usuarios en un período de una semana:

SELECT
  user_dim.geo_info.city,
  COUNT(user_dim.geo_info.city) as city_count 
FROM
TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
GROUP BY
  user_dim.geo_info.city
ORDER BY
  city_count DESC

También se puede escribir una consulta para comparar el uso de teléfonos móviles y tablets en las diferentes plataformas en un período de una semana:

SELECT
  user_dim.app_info.app_platform as appPlatform,
  user_dim.device_info.device_category as deviceType,
  COUNT(user_dim.device_info.device_category) AS device_type_count FROM
TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
GROUP BY
  1,2
ORDER BY
  device_type_count DESC

Para aumentar la complejidad, se puede escribir una consulta que genere un informe de eventos de usuario único en las diferentes plataformas durante las últimas dos semanas. Aquí, se usan PARTITION BY y EXACT_COUNT_DISTINCT para eliminar duplicados del informe de eventos por usuario aplicando propiedades de usuario y el campo user_dim.user_id:

SELECT 
  STRFTIME_UTC_USEC(eventTime,"%Y%m%d") as date,
  appPlatform,
  eventName,
  COUNT(*) totalEvents,
  EXACT_COUNT_DISTINCT(IF(userId IS NOT NULL, userId, fullVisitorid)) as users
FROM (
  SELECT
    fullVisitorid,
    openTimestamp,
    FORMAT_UTC_USEC(openTimestamp) firstOpenedTime,
    userIdSet,
    MAX(userIdSet) OVER(PARTITION BY fullVisitorid) userId,
    appPlatform,
    eventTimestamp,
    FORMAT_UTC_USEC(eventTimestamp) as eventTime,
    eventName
    FROM FLATTEN(
      (
        SELECT 
          user_dim.app_info.app_instance_id as fullVisitorid,
          user_dim.first_open_timestamp_micros as openTimestamp,
          user_dim.user_properties.value.value.string_value,
          IF(user_dim.user_properties.key = 'user_id',user_dim.user_properties.value.value.string_value, null) as userIdSet,
          user_dim.app_info.app_platform as appPlatform,
          event_dim.timestamp_micros as eventTimestamp,
          event_dim.name AS eventName,
          event_dim.params.key,
          event_dim.params.value.string_value
        FROM
         TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
), user_dim.user_properties)
)
GROUP BY
  date, appPlatform, eventName

Si dispones de datos en Google Analytics para la misma app, también es posible exportar tus datos de Google Analytics a BigQuery y realizar una COMBINACIÓN con tus tablas de BigQuery de Firebase Analytics.


Cómo visualizar datos de análisis


Ahora que obtuvimos estadísticas de la app para dispositivos móviles usando la exportación sin procesar de BigQuery, las visualizaremos usando Google Data Studio. Data Studio puede realizar lecturas directamente en las tablas de BigQuery e incluso se le puede transmitir una consulta como las anteriores. También puede generar muchas clases de gráficos diferentes según la estructura de tus datos; se incluyen las series temporales, los gráficos de barras y circulares, y los geomapas.

Para nuestra primera visualización, crearemos un gráfico de barras que destinaremos a comparar los tipos de dispositivos desde los cuales los usuarios acceden a la app en cada plataforma. Se puede pegar en Data Studio la consulta comparativa anterior sobre teléfonos móviles y tablets para generar el siguiente gráfico:
A partir de este gráfico, se puede observar fácilmente una mayor probabilidad de que los usuarios de iOS accedan al juego desde una tablet. Para aumentar la complejidad, se puede usar la consulta de informe de eventos anterior para crear un gráfico de barras en el que se compare la cantidad de eventos en diferentes plataformas:
Visita esta publicación para hallar instrucciones detalladas sobre la forma de conectar tu proyecto de BigQuery a Data Studio.

Lo que viene

Si no conocías Firebase, comienza aquí. Si ya estás desarrollando una app para dispositivos móviles en Firebase, consulta esta guía detallada en la que se indica la manera de vincular tu proyecto de Firebase a BigQuery. Para realizar preguntas, consulta los documentos de referencia de BigQuery y usa las etiquetas firebase-analytics y google-bigquery en Stack Overflow. Notifícame si deseas que incluya tema en particular en una publicación futura.

Publicado por Chris Jones, Equipo social, AdMob.

Los elementos nativos son el próximo gran concepto de la publicidad móvil y se espera que su volumen en términos económicos alcance los ...
Publicado por Chris Jones, Equipo social, AdMob.

Los elementos nativos son el próximo gran concepto de la publicidad móvil y se espera que su volumen en términos económicos alcance los USD 21 mil millones en 2018. Esto supone una enorme oportunidad para los desarrolladores de apps, pero ¿de qué manera puedes usar los anuncios nativos para potenciar la experiencia del usuario y monetizar tu app? A continuación, se ofrece un panorama rápido de lo que representa la publicidad nativa y de los primeros pasos que puedes dar.

¿Qué significa “nativo”?
Los anuncios nativos se adecuan a la forma y la función de la experiencia del usuario a la que se integran. También se adecuan al diseño visual de la app en la que se encuentran. Los anuncios nativos amplían la experiencia del usuario al ofrecer valor a través de anuncios pertinentes que fluyen dentro del contexto del contenido relacionado con la app. Dicho de una manera simple: los anuncios nativos cuadran.


La publicidad nativa no es algo nuevo.
Desde los días gloriosos de la radio inalámbrica y los diarios, los anunciantes han buscado formas innovadoras de adaptar sus marcas y mensajes a los entornos en los que se ofrecen a los consumidores. En el mundo de la publicidad digital, Google fue uno de los primeros anunciantes “nativos” y desarrolló anuncios de búsqueda que se adecuaron directamente a la información de la página de resultados de búsqueda.

Sin embargo, hoy los consumidores están en todas partes.
La empresa debió adaptarse y brindar contenido de mayor calidad que pudiera adecuarse a diferentes pantallas y tamaños. Por ejemplo, en los sitios web optimizados para plataformas móviles ahora se incluyen botones y fuentes grandes, y las apps para dispositivos móviles permiten a los usuarios desplazarse hacia arriba y abajo, o de izquierda a derecha, en lugar de hacer clic en las páginas que desean ver. En el marco del paradigma nativo, preservar esa experiencia de usuario es también fundamental para desarrollar publicidad con éxito.

Nuestro contenido ha evolucionado y lo mismo debe suceder con nuestros anuncios.
A nadie le agrada que un anuncio invasivo y desagradable se cuele en su app. La publicidad nativa ofrece una solución simple: anuncios que se adecuan a la forma y función del contenido de un desarrollador. Te ayudamos a crear anuncios estéticos y atractivos para mantener el buen humor de los consumidores.

Los anuncios nativos son cohesivos.
Nunca sobresalen de manera notoria. Se diseñan para adecuarse al aspecto de la app y guardar una relación coherente con el comportamiento de la plataforma, a fin de que quienes los visualicen tengan la sensación de que se adaptan a la perfección a sus experiencias de contenido. Dicho de otra manera: son anuncios en los que se contempla la experiencia del usuario.

Puedes poner manos a la obra con 5 pasos sencillos:
  1. Accede a tu cuenta de AdMob en https://apps.admob.com.
  2. Haz clic en la pestaña Monetize, luego en All apps, + new ad unit y Native.
  3. Selecciona entre diferentes tamaños,  plantillas y tipos  de anuncios.
  4. Personalízalos para que se adecuen a la IU de tu app.
  5. Escribe algunas líneas de código en tu app para solicitar tus nuevos anuncios nativos. ¡Facilísimo!

AdMob by Google es una de las principales plataformas de anuncios para dispositivos móviles, en la que confían más de 650.000 aplicaciones en todo el mundo. Si deseas conocer más acerca de AdMob, visita este enlace.



El GPS es el caballo de batalla de los servicios basados en localización. Sin embargo, existen casos de uso en los cuales probablemente desees evitar el costo y el consumo de energía que suponen el hardware GPS o la localización de dispositivos en sitios en los que estos sistemas carezcan de precisión; por ejemplo, en entornos urbanos o edificios.


El GPS es el caballo de batalla de los servicios basados en localización. Sin embargo, existen casos de uso en los cuales probablemente desees evitar el costo y el consumo de energía que suponen el hardware GPS o la localización de dispositivos en sitios en los que estos sistemas carezcan de precisión; por ejemplo, en entornos urbanos o edificios.

Recientemente, hemos observado un aumento en el número de aplicaciones relacionadas con la Internet de las cosas (IoT) que usan la Google Maps Geolocation API en lugar de GPS para el seguimiento de recursos, la prevención de robos, la optimización en el uso y el mantenimiento de recursos, entre otros aspectos. Como parte de mi proyecto relacionado con la propuesta del 20 por ciento del tiempo, en el área de soluciones industriales, creé un prototipo de dispositivo de IoT que puede localizarse a sí mismo a través de redes WiFi circundantes y de la Google Maps Geolocation API. En esta entrada, trataré algunas funciones de implementación interesantes y señalaré la forma en que tú mismo puedes crear el prototipo.

Creé un dispositivo que realiza un análisis en busca de redes WiFi locales y registra, mediante escritura, los resultados (los hotspots WiFi y la intensidad de su señal) en una base de datos en tiempo real de Firebase. Un servicio de backend luego lee estos datos y usa la Google Maps Geolocation API para convertirlos en una ubicación real que puede representarse en un mapa.

Configurar el dispositivo y realizar operaciones de escritura a nivel local

Para esta prueba de concepto, usé el módulo Intel Edison como plataforma de cálculo basada en Linux y lo expandí con bloques Sparkfun para Edison. Para crear el dispositivo, necesitarás un módulo Intel Edison, un bloque básico un bloque de batería y un paquete de hardware.

Realizar desarrollos para Edison es sencillo con el IDE de Intel XDK. Crearemos una aplicación Node.js simple en JavaScript. Me basé en 3 bibliotecas: Firebase para la conexión con la base de datos, wireless-tools/iwlist para captar redes WiFi y macaddress para captar la dirección MAC del dispositivo. Las instrucciones de instalación pueden hallarse en las páginas vinculadas.

Paso 1: obtener la dirección MAC del dispositivo y establecer la conexión con Firebase.
function initialize() {
    macaddress.one('wlan0', function (err, mac) {
        mac_address = mac;
        if (mac === null) {
            console.log('exiting due to null mac Address');
            process.exit(1);
        }
        firebase.initializeApp({
            serviceAccount: '/node_app_slot/<service-account-key>.json',
            databaseURL: 'https://<project-id>.firebaseio.com/'
        });
        var db = firebase.database();
        ref_samples = db.ref('/samples');
        locationSample();
    });
}
El código anterior contiene dos marcadores de posición:

  1. service-account-key es una clave privada que se crea en la consola de Firebase. Usa el ícono de ajustes de la parte superior izquierda de la consola, selecciona “Settings” y haz clic en Generate New Private Key. Dispón esta clave en tu Edison, dentro del directorio /node_app_slot/. Para obtener más información, consulta esta documentación de Firebase.
  2. project-id, en la URL de la base de datos, se encuentra en la página de la base de datos de la consola de Firebase una vez que vinculas tu proyecto de Google con Firebase.


Paso 2: buscar redes WiFi cada 10 segundos y realizar operaciones de escritura a nivel local.
function locationSample() {
    var t = new Date();
    iwlist.scan('wlan0', function(err, networks) {
        if(err === null) {
            ref_samples.push({
                mac: mac_address,
                t_usec: t.getTime(),
                t_locale_string: t.toLocaleString(),
                networks: networks,
            });
        } else {
            console.log(err);
        }        
    });
    setTimeout(locationSample, 10000);
}

Realizar operaciones de escritura en la nube

La función locationSample() de arriba registra, mediante escritura, redes WiFi detectables en una base de datos de Firebase que se sincroniza con la nube al establecerse una conexión con una red.

Advertencia: Para establecer derechos de acceso y la autenticación de Firebase, se configura el dispositivo como “servidor”. En el sitio web de Firebase, se encuentran disponibles instrucciones para esta configuración. Para esta prueba de concepto, supuse que el dispositivo era suficientemente seguro como para alojar nuestras credenciales. Si esto no se aplica a tu implementación, como alternativa debes seguir las instrucciones para configurar el JavaScript SDK de cliente.

La base de datos usa 3 colas para administrar la carga de trabajo: una de ejemplos de WiFi, una de resultados de ubicación geográfica y una de datos de visualización. El flujo de trabajo será el siguiente: los ejemplos del dispositivo van en una cola de ejemplos, que se consume para producir ubicaciones geográficas dispuestas en una cola de ubicación geográfica. Las ubicaciones geográficas se consumen, reciben formato para su presentación y se organizan por dispositivo, y el resultado se almacena en un depósito de visualizaciones para su uso a través del sitio web de front end.

A continuación, se ofrecen un ejemplo, una ubicación geográfica, y los datos de visualización escritos por el dispositivo y observados en la consola de la base de datos de Firebase.

Procesamiento de los datos con Google App Engine

Para ejecutar el procesamiento de los datos de ejemplo, usé un módulo de backend de Google App Engine de ejecución prolongada y una versión personalizada del Java Client for Google Maps Services.

Advertencia: Para usar Firebase con App Engine, debes aplicar escalamiento manual. Firebase usa subprocesos en segundo plano para detectar cambios y App Engine solo permite subprocesos en segundo plano de larga duración en instancias de backend de escalamiento manual.

Java Client for Google Maps Services se encarga de una gran parte del código de comunicaciones necesario para usar las Maps API y aplica nuestras prácticas recomendadas publicadas para las estrategias de manejo de errores y reintentos que respetan límites de tasa. La función GeolocateWifiSample(), a continuación, se registra como un detector de eventos con Firebase. Realiza ciclos en cada red indicada por el dispositivo y la incorpora a la solicitud de ubicación geográfica.
private void GeolocateWifiSample(DataSnapshot sample,  Firebase db_geolocations, Firebase db_errors) {
    // initalize the context and request
    GeoApiContext context = new GeoApiContext(new GaeRequestHandler()).setApiKey("");
    GeolocationApiRequest request = GeolocationApi.newRequest(context)
            .ConsiderIp(false);
    // for every network that was reported in this sample...
    for (DataSnapshot wap : sample.child("networks").getChildren()) {
        // extract the network data from the database so it’s easier to work with
        String wapMac = wap.child("address").getValue(String.class);
        int wapSignalToNoise = wap.child("quality").getValue(int.class);
        int wapStrength = wap.child("signal").getValue(int.class);
        // include this network in our request
        request.AddWifiAccessPoint(new WifiAccessPoint.WifiAccessPointBuilder()
                .MacAddress(wapMac)
                .SignalStrength(wapStrength)
                .SignalToNoiseRatio(wapSignalToNoise)
                .createWifiAccessPoint());
    }
    ...
    try {
        // call the api
        GeolocationResult result = request.CreatePayload().await();
        ...
        // write results to the database and remove the original sample
    } catch (final NotFoundException e) {
        ...
    } catch (final Throwable e) {
        ...
    }
}
Registra la función GeolocateWifiSample() como un controlador de eventos. Los demás receptores que procesan resultados de ubicación geográfica y crean los datos de visualización se crean con un patrón similar.
ChildEventListener samplesListener = new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
        // geolocate and write to new location
        GeolocateWifiSample(dataSnapshot, db_geolocations, db_errors);
    }
    ...
};
db_samples.addChildEventListener(samplesListener);

Visualizar los datos

Para visualizar las ubicaciones de dispositivos, usé Google App Engine a fin de proporcionar datos almacenados de Firebase y de la Google Maps JavaScript API, con los cuales creé una página web simple en la que se muestran los resultados. La página index.html contiene un <div> vacío con ID “map”. Inicialicé este <div> para contener el proyecto de Google Map. También agregué los controladores de eventos “child_added” y “child_removed” para actualizar el mapa a medida que los datos cambien con el paso del tiempo.
function initMap() {
    // attach listeners
    firebase.database().ref('/visualization').on('child_added', function(data) {
        ...
        data.ref.on('child_added', function(vizData) {
            circles[vizData.key]= new CircleRoyale(map,
                                vizData.val().lat,
                                vizData.val().lng,
                                vizData.val().accuracy,
                                color);
          set_latest_position(data.key, vizData.val().lat, vizData.val().lng);
        });
        data.ref.on('child_removed', function(data) {
            circles[data.key].removeFromMap();
        });
    });
    // create the map
    map = new google.maps.Map(document.getElementById('map'), {
      center: get_next_device(),
      zoom: 20,
      scaleControl: true,
    });
    ...
}
Debido a que la API no solo muestra una ubicación sino también un indicio de precisión, creé un indicador personalizado con un radio de pulso para indicar el componente de precisión.
Dos dispositivos (rojo y azul) y las últimas cinco posiciones conocidas de estos.

Lo que viene

En esta entrada, indiqué la manera en que puedes crear un dispositivo de IoT que use la Google Maps Geolocation API para realizar un seguimiento de cualquier dispositivo conectado a Internet, desde los robóticos hasta los wearables. El módulo de procesamiento de App Engine puede expandirse para usar otros servicios web de Google Maps API que proporcionen datos geográficos, como las indicaciones, la elevación, los lugares o la zona horaria. ¡A disfrutar de la codificación!

Como alternativa, puedes lograr una solución similar usando Google Cloud Platform como sustituto de Firebase; en este artículo se muestra la forma de hacerlo.

author image
Acerca de Ken: Ken es jefe del equipo de soluciones industriales de Google. Trabaja junto a los clientes para aportar soluciones innovadoras al mercado.