Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android

Respuesta
 
Herramientas
  #1  
Viejo 05/10/16, 12:09:27
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 218
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Duda servidores , notificaciones en app

Buenas, a ver si me orientáis.

He programado una app tipo gps tracker sencillita en la cual una vez comienzo una ruta se puede ver en el mapa la linea por donde vas, velocidad, distancia, tiempo, etc. Ademas todos estas coordenadas de longitud, latitud, altitud y alguno mas los voy guardando en un servidor gratutito (http://www.host-ed.net) a la vez que en el dispositivo a través de SQLite para tener acceso a un historico de las rutas hechas.

Para poder usar la app he puesto un sistema de login con usuario y contraseña que lo valida el servidor con PHP y MySQL. De esta forma he creado un sistema para agregar amigos y de esta forma poder ver ademas de por donde voy yo, por donde va el amigo seleccionado en caso de que esté en movimiento y mas datos como distancia entre ambos, etc. para ello he tenido que idear un sistema de agregar amigo, eliminarlo etc, todo ello a través de volley conectándose al servidor y éste devolviendo respuestas en JSON (una movida porque no tenia ni zorra de como hacer esto último en PHP aunque pensando un poco al final se saca todo).

El problema es que cuando mandas una solicitud a alguien , evidentemente no le salta al movil al instante , sino que este tiene que pulsar un botón de buscar solicitudes para que le aparezca, lo cual no queda ni bien ni profesional.

Aqui es cuando me pongo a leer y veo que todo lo realizado me ha valido para practicar lo aprendido en php por mi cuenta con unos cuantos tutoriales ya que no sabia pero que a la hora de la verdad hay otros sistemas segun veo como FIREBASE el cual proporciona un sistema de autentificación mucho mas seguro , notificaciones etc bastante completo.

La App funciona bastante bien pero me da la impresión de que cuando se conecten 10 o más tios a la vez, las peticiones al servidor para insertar las coordenadas, devolver datos etc. en un servidor de estos, como sean en el mismo momento no se si funcionará o hará aguas por todos los lados.

También se podria hace con Google Cloud Messaging? Antes parece que estaba lo de parse.com pero no se si lo cerraron.

Que habría que hacer para implementarlo en mi caso? Supongo que los cientos de lines de código y comeduras de cabeza en PHP y Mysql no me habrán servido para nada en caso de cambiar?
Usar FireBase? GCM ? Que se lleva ahora para estas cosas?
Responder Con Cita


  #2  
Viejo 05/10/16, 12:53:08
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Lo de notificar a un amigo tienes que hacerlo con Google Cloud Messaging (GCM), que por cierto ahora se llama Firebase Cloud Messaging (FCM).

De hecho han agrupado muchas cosas bajo el paraguas de Firebase, que entre otros servicios lleva base de datos, que ciertamente te vendría bien para la autenticación y almacenamiento de las rutas.

El problema de Firebase o el antiguo Parse (están en proceso de cierre aunque liberaron el código, tienes un hilo en este mismo foro) es que suele estar pensada para que un usuario consulte sus datos, no los de los demás. El tema de compartir la ruta con otros usuarios en tiempo real no sé hasta qué punto se podrá hacer configurando permisos de los datos o si necesitarás un servidor con lógica adicional (lo más probable).
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #3  
Viejo 06/10/16, 14:32:09
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 218
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Voy a ponerme a mirar lo de FIrebase a ver como va.

Dices que Firebase esta pensada para que un usuario consulte solo sus datos. Yo pensaba que se podrian hacer consultas a una BASE DE DATOS COMUN que te devolviese informacion, asi lo hago yo a traves de volley con Get o post y todo direccionado a una misma BD con respuestas en JSON, pero sera cuestion de ver como funciona.
Responder Con Cita
  #4  
Viejo 06/10/16, 15:23:56
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Reformulo la frase de antes @manolazo

La base de datos de Firebase te la venden como que no necesitas infraestructura y te olvidas de servidores. En efecto puedes hacer muchas apps que permitan guardar datos en la nube sin necesidad de servidores, pero el escenario típico es que un usuario guarde sus datos y consulte sus datos (sincronizando diversos dispositivos por ejemplo).

Sí que puedes tener una base de datos común, basta especificar su URL, pero para que los usuarios interaccionen o compartan datos hace falta un servidor por medio, aunque sea para gestionar la información y los permisos que tiene cada usuario.

Podrías aprovechar algunas funciones interesantes de Firebase como las reglas de seguridad, para que los amigos autorizados puedan suscribirse al documento que guarda el log del GPS del amigo en cuestión y recibir notificaciones cada vez que lo actualice.

Desde el punto de vista de escalabilidad podría ayudar, el servidor solo tendría que escribir algunos datos o reglas y los usuarios escribirían directamente en Firebase y se suscribirían directamente a la información en Firebase, dejando al servidor bastante tranquilo.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!

Última edición por mocelet Día 06/10/16 a las 15:28:31.
Responder Con Cita
  #5  
Viejo 13/10/16, 21:07:28
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 218
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
gracias @mocelet

He estado mirando la documentación de firebase (https://firebase.google.com/docs/clo...g/server?hl=es) y he estado haciendo pruebas para el envió de notificaciones desde el servidor de firebase hacia el dispositivo, también se puede hacer creando un pequeño servidor propio el cual se conecta a firebase con el cual puedes enviar mensajes si quieres con imágenes etc lo cual se haría a través del protocolo HTTP sentido descendente.

El problema viene si quieres hacerlo bidireccional (ascendente/descendente) es decir, de dispositivo a dispositivo, según parece hay que implementar un server con protocolo XMPP el cual guardaría la web api key para que no este expuesta en el lado del cliente (dispositivo a nube, nube a dispositivo). Es aquí donde me quedo estancado ya que no veo ejemplos práctico sobre como implementar un servidor XMPP de estos . Hay ejemplos de GCM pero no de FCM en este sentido.

alguna idea?
Responder Con Cita
  #6  
Viejo 13/10/16, 22:38:47
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Del servidor no te libra nadie a poco que quieras que dos usuarios compartan información. Y, en realidad, no quieres comunicación directa dispositivo-dispositivo para nada (que sería el escenario de XMPP) porque la información la deberías tener guardada en alguna base de datos, no en el dispositivo del usuario.

Teniendo servidor, el sentido ascendente es trivial, es lo que ya haces por HTTP o, si necesitas algo más de interactividad, con websockets. Y el GCM/FCM lo usas para avisar al otro usuario de que hay información nueva en la app para que la consulte (o bien le mandas la información ya en la notificación)
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #7  
Viejo 13/10/16, 23:55:28
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 218
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Pero en el caso de enviar una solicitud de agregar un amigo a otro dispositivo, supongo que seria una comunicacion directa ya que esa notificacion apareceria al instante . Aqui si que habria que implementar un XMPP verdad? o se puede hacer de otra manera?

 Cita: Originalmente Escrito por mocelet Ver Mensaje
Teniendo servidor, el sentido ascendente es trivial, es lo que ya haces por HTTP o, si necesitas algo más de interactividad, con websockets. Y el GCM/FCM lo usas para avisar al otro usuario de que hay información nueva en la app para que la consulte (o bien le mandas la información ya en la notificación)
Esto último es lo que no entiendo. Si mando un mensaje al servidor para notificar a otro dispositivo desde mi movil de que le quiero agregar, se supone que se queda almacenado en el server de FCM , pero entonces como lo manda de forma inmediata al otro dispositivo ? no se supone que para eso se usa el sistema ascendente/descendente con el XMPP?
se podria hacer por websockets ?
Perdona que tengas estas dudas pero igual es que no pillo bien el concepto .

Última edición por manolazo Día 14/10/16 a las 00:24:48.
Responder Con Cita
  #8  
Viejo 14/10/16, 09:48:34
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Creo que hablamos de dos cosas distintas con la palabra "servidor". Me refiero a tu propio servidor como ahora, y para la app es transparente si la base de datos es Firebase database o un MySQL que te instales o cualquier otra.

En ese caso un usuario se comunica por HTTP con tu servidor y tu servidor manda la notificación con FCM al otro usuario.

Hacerlo sin servidor usando únicamente los servicios de Firebase no lo termino de ver.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #9  
Viejo 31/10/16, 17:40:53
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 218
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Bueno pues el otro dia me puse con esto y al final lo he hecho de la siguiente manera.

Lo de las agregar solicitudes de amistad y que lleguen al instante al otro movil , no lo he hecho con Firebase Cloud Messaging como comentamos antes , sino como Firebase Realtime Database. Para enviarlas:

Código:
String userId;
    private void enviarSolicitudFirebase(String solicitante, String solicitado, String comentario){

        userId =  mFirebaseDatabase.push().getKey();
        Map<String,Object> map2 = new HashMap<String, Object>();
        map2.put("solicitante",solicitante);
        map2.put("solicitado",solicitado);
        map2.put("mensaje",comentario);
        mFirebaseDatabase.child(userId).setValue(map2);

    }
Y para recibirlas:
Código:
en OnCreate:
 	mFirebaseInstance = FirebaseDatabase.getInstance();
        mFirebaseDatabase = mFirebaseInstance.getReference("SolicitudesAmistad");
        buscarSolicitudesFirebase();

private void buscarSolicitudesFirebase(){
        mFirebaseDatabase.addChildEventListener(new ChildEventListener() {
           @override
           public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            
               onRefreshingChild(dataSnapshot);            
               new Handler().post(new Runnable() {
                   @override
                   public void run() {
                       if(!(isFinishing())){
                          crearAlertDialog();
                       }
                   }
               });
           }
           @override
           public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
           @override
           public void onChildRemoved(DataSnapshot dataSnapshot) {}
           @override
           public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
           @override
           public void onCancelled(DatabaseError databaseError) {}
       });
    }
El metodo onChildAdded notifica cualquier modificacion en tiempo real y cuando se agregan solicitudes a la base de datos, se muestran en un AlertDialog para posteriormente aceptarlas o rechazarlas ,ya sea una o varias.
Hay más código para almacenar los datos en colecciones (arrayList o hashmaps), etc.
He estado probando en varios terminales y funciona bastante bien, aunque no se si sera lo correcto para estos casos.
Responder Con Cita
  #10  
Viejo 31/10/16, 20:03:13
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

Una pregunta entonces, según lo tienes ahora, imagina que tienes 3 usuarios. El usuario1 invita al usuario2. ¿El usuario3 también se entera porque está suscrito a la misma base de datos, no? ¿O en algún sitio escribes explícitamente en una cola de solicitudes pendientes de un usuario concreto?

Si lo reciben todos tienes un problema gordo en cuanto crezca el número de usuarios y se te va a disparar el número de mensajes del API porque cualquier invitación va a llegar a todos los usuarios. Además de la falta de privacidad porque puedes ver invitaciones que no son tuyas.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #11  
Viejo 31/10/16, 20:34:49
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 218
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Ya lo tengo programado para que cada solicitado reciba las notificiones solo de los solicitantes que lo piden, el resto no se entera porque para ello pongo un filtro . Luego cuando se van aceptando o rechazando se van quitando de la cola de solicitudes de la base de datos.

Faltan mas lineas de código que no he puesto arriba ya que lo resumi bastante. He probado con unos cuantos usuarios todo tipo de variaciones. quitando, poniendo, etc y funciona bien.

En caso de abrir la app y tener 10 solicitudes pendientes , seleccionas del alertDailog las que quieras y listo. En caso de no ser tu el solicitado no te aparecera nada.
Responder Con Cita
  #12  
Viejo 31/10/16, 20:46:29
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

 Cita: Originalmente Escrito por manolazo Ver Mensaje
el resto no se entera porque para ello pongo un filtro
Ya, ¿pero el filtro está en Firebase para que solo notifique al usuario que tiene notificar o le va a llegar la notificación a todo el mundo (incluso si no tienen nada que ver) y luego lo que haces es no mostrarla?

 Cita: Originalmente Escrito por manolazo Ver Mensaje
Luego cuando se van aceptando o rechazando se van quitando de la cola de solicitudes de la base de datos.
Si yo fuera un usuario malintencionado, ¿podría borrarte todas las solicitudes incluso si no son para mí, verdad? ¿O en Firebase tienes alguna regla para que un usuario solo pueda borrar solicitudes únicamente si es el solicitante o el solicitado?

Por eso decía antes que no veo cómo hacerlo sin un servidor que controle el tema de permisos y a quién notificar.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #13  
Viejo 31/10/16, 20:57:44
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 218
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
Pues ahi me has pillado, el filtro lo tengo puesto en la app, no lo tengo en FIrebase, de hecho ahi tengo las reglas todas puestas como
"rules": {
".read": true,
".write":true
}
Y como un usuario malintencionado puede entrar en Firebase y borrar las solicitudes? Ya se que esta abierto en modo lectura y escritura aunque fectivamente decopilando el apk y modificando el código lo haces. ...!!
Responder Con Cita
  #14  
Viejo 31/10/16, 21:18:38
Array

[xs_avatar]
mocelet mocelet no está en línea
Desarrollador
 
Fecha de registro: may 2011
Localización: Madrid
Mensajes: 2,202
Tu operador: -

 Cita: Originalmente Escrito por manolazo Ver Mensaje
Ya se que esta abierto en modo lectura y escritura aunque fectivamente decopilando el apk y modificando el código lo haces. ...!!
No hay que modificar ningún código porque si la raíz de la base de datos tiene permiso de escritura público con saber el nombre de la base de datos ya haces lo que quieras con ella.

Pero eso es lo de menos, es más preocupante lo de que yo invite a un amigo y los móviles de todos los demás se despierten, gasten datos, batería y tiempo de proceso para nada porque no era para ellos.
__________________
El mejor Cuatro en Raya de Android (Hilo en HTCMania, Play Store) ¡Un millón de descargas!
Responder Con Cita
  #15  
Viejo 31/10/16, 22:06:40
Array

[xs_avatar]
manolazo manolazo no está en línea
Miembro del foro
 
Fecha de registro: jun 2012
Localización: Madrid
Mensajes: 218
Modelo de smartphone: Samsung Galaxy S7 edge
Tu operador: Pepephone
La app la tengo para conocidos y gente del entorno, si la pongo en google play no se la descarga ni cristo porque hay cientos como esa y para las notificaciones de solicitud de amistad se hacen muy poco , solo cuando te das de alta y agregas a quien te interese.

Pues nada ,esta claro que si se va a hacer de forma profesional por lo que comentas esto no seria viable y habria que hacerlo con un servidor que lo regule.
Responder Con Cita
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 18:44:31 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /