Mensajero del correo. Dos trucos para el buen funcionamiento de la aplicación. Cómo hicimos que la aplicación fuera rápida

Ha pasado menos de una semana desde la presentación del nuevo mensajero TamTam del grupo Mail.ru y ya hay acalorados debates en línea sobre sus ventajas y perspectivas. El corresponsal de la agencia de noticias AmurMedia, Evgeniy Nikitenko, como parte de la columna DIGITAL, entiende qué es la nueva aplicación que reemplazó a los "Mensajes OK".

Desde el inicio del proyecto, los desarrolladores advirtieron al público que TamTam es un replanteamiento de los "mensajes OK" con marquesinas en forma funcionalidad adicional. No en vano, TamTam simplemente reemplaza el OK Messenger indicado mediante una actualización normal. Pero echemos un vistazo a lo que nos deleitará el nuevo programa, porque, como ve, es interesante cómo una empresa que ya posee mensajería instantánea como ICQ y Mail.ru Agent, las redes sociales Odnoklassniki y VKontakte puede sorprender a ¿Audiencia moderna hastiada?

Para ser honesto, estábamos un poco indecisos antes de instalar TamTam en un dispositivo móvil, ya que por experiencias anteriores recordábamos perfectamente lo difícil que puede ser eliminar los productos de Mail.ru Group de computadora personal, y mucho menos un teléfono inteligente: nadie quería restablecer el sistema a la configuración de fábrica. Como resultado, se decidió instalar el programa en un teléfono inteligente con sistema operativo Android, sobre todo porque anteriormente se afirmó que “TamTam es completamente gratuito y no demuestra mensajes publicitarios", y esto da esperanza de que productos adicionales no se incluirá.

Bueno, comencemos, afortunadamente la aplicación está disponible tanto para Android como para iOS. Cabe señalar que en menos de una semana desde el lanzamiento de la aplicación, con Mercado de juego Más de 1 millón de personas ya lo han descargado.

Por cierto, en cuanto a las cuentas: TamTam está integrado con Odnoklassniki, por lo que no es necesario crear una nueva "cuenta". Al mismo tiempo, puedes crear fácilmente una cuenta en TamTam sin estar atado a red social, pero este es un paso bastante controvertido, ya que al hacerlo "cortas" una parte importante de la funcionalidad y te privas de aquellas ventajas que podrían convertirse en un incentivo para elegir. este mensajero. Por cierto, también puedes iniciar sesión a través de Google.

La interfaz de TamTam en sí no ofrece nada radicalmente nuevo y no pretende ser ideas revolucionarias: después de la instalación, veremos exactamente lo que vimos en decenas de mensajeros antes y, muy probablemente, en muchos otros servicios años después. Entre las diferencias realmente interesantes con respecto a Viber o WhatsApp, cabe destacar la posibilidad de exportar contactos no sólo desde la memoria del teléfono, sino también directamente desde la lista de "amigos" en Odnoklassniki. Pero esto, por supuesto, sólo será interesante. usuarios activos red social - para otros, como nuestro corresponsal, que visita su página de vez en cuando, la posibilidad de "exportar" el tiempo no lo hizo posible.



Mensajero TamTam. Foto: Evgeny Nikitenko, corr. IA AmurMedia

Ya que hablamos de funcionalidad, TamTam te permite mantener correspondencia en mensajes privados, crear chats grupales, enviar stickers, gifs, fotos y audio. Las llamadas no son ni de vídeo ni de audio, al menos en En este punto, no será posible lograrlo. Lo cual, por supuesto, no suma puntos a un novato en comparación con las aplicaciones móviles existentes. Pero los canales a los que los usuarios fueron enseñados por otro joven mensajero de telegramas- La idea es potencialmente (especialmente teniendo en cuenta la conexión TamTam-Odnoklassniki) bastante prometedora. Explicaremos por qué un poco más adelante.



Algunas estrellas también iniciaron canales el día del lanzamiento del Messenger. El mundo del espectáculo ruso, por ejemplo, Polina Gagarina, a quien durante este tiempo lograron suscribirse casi novecientos usuarios.



Canales TamTam. Foto: Evgeny Nikitenko, corr. IA AmurMedia

Las perspectivas de los canales como tales en el caso de TamTam se justifican, en primer lugar, por los trescientos millones de audiencia de Odnoklassniki, pero aún no se sabe cuántos usuarios cambiarán al messenger si no está integrado en la versión web de la red social. pregunta. Corresponder entre TamTam y Odnoklassniki es una cosa, pero para monitorear el canal tendrás que conseguir un mensajero, y aquí surge la pregunta sobre la conveniencia de instalarlo únicamente para acceder a los canales.

Los editores también quedaron desconcertados por el conjunto de pegatinas que, por decirlo suavemente, son sorprendentemente diferentes de esa linda lista de Odnoklassniki. Simplemente compare:

Compañeros de clase



Un conjunto de pegatinas en Odnoklassniki. Foto: Evgeny Nikitenko, corr. IA AmurMedia

TAM Tam



Conjunto de pegatinas en TamTam. Foto: Evgeny Nikitenko, corr. IA Amur Media

Pero por ahora es mejor dejar los stickers sin comentarios, a algunas personas les gustan las canónicas, otros estarán a favor de una opción nueva y única. En cualquier caso, todos los rotuladores tienen gustos y colores diferentes, por lo que os invitamos, queridos lectores, a decidir por vosotros mismos vuestra actitud ante ambas versiones.

Volviendo a los méritos del mensajero, los propios autores afirman que funciona incluso con mal internet conexión y puede enviar mensajes sin conexión: los mensajes llegarán al destinatario cuando aparezca la red. No está claro si vale la pena llamar la atención sobre este "logro", porque incluso "abuelos" como WhatsApp pueden presumir de tal "característica".

En conclusión, observamos que, en nuestra opinión, TamTam claramente no mata a los mensajeros de la competencia, pero si se propone promocionar la empresa, entonces puede ser una buena opción. TamTam, después de todo, se creó sobre la base de Odnoklassniki y, por lo tanto, tiene todas las posibilidades de atraer rápidamente a una parte importante de su audiencia multimillonaria, a la que nadie prohíbe "atraer" a su canal. Al mismo tiempo, cómo aprovechar las oportunidades que surgen depende sólo de usted: el programa es nuevo, tiene una perspectiva muy definida, pero probablemente dentro del marco específico de la audiencia existente. En cuanto al uso del programa directamente como mensajero, el camino de desarrollo aún no está claro y sólo el tiempo dirá lo que sucederá: si TamTam seguirá siendo un producto de nicho o ganará una gran popularidad.

Por cierto, ¿qué opinas del nuevo mensajero de Mail.ru?

Cada persona que creó correo electrónico en el servidor mail.ru, puede utilizar automáticamente el mensajero Mail.Ru Agent, más precisamente, su versión web llamada "Web Agent". No se requiere instalación para trabajar con él, porque la versión web de este programa fácil de usar con interfaz amigable disponible inmediatamente cuando inicias sesión en tu correo electrónico.

Funcional

Disponible:

  • funciona en la mayoría de los navegadores modernos;
  • enviar mensajes de texto, animaciones o archivos multimedia usuarios de la lista de contactos;
  • apertura simultánea de hasta cuatro Cuadros de diálogo;
  • crear chats grupales;
  • busque contactos por número de teléfono, correo electrónico o ICQ.

Ventajas y desventajas

Usando la versión en línea del Agente, puede enviar mensajes gratis. Para hacer esto, en la ventana principal del Messenger debe seleccionar el botón requerido o seleccionar un contacto de la lista y marcar lo que se debe hacer.

Mientras chatea, puede enviar mensajes de texto, contenido multimedia o interesantes vídeos de dibujos animados integrados en el Messenger a sus interlocutores.

La versión web admite la apertura simultánea de cuatro cuadros de diálogo y la comunicación con cuatro personas por separado. También es posible crear y comunicar en chats grupales.

Compatible con la versión web mayoría oportunidades disponibles a través de cliente estándar. Le permite agregar una persona con la que mantuvo correspondencia por correo electrónico a su lista de contactos. Aquí también puedes encontrar una persona por nombre y apellido, direccion postal o número icq.

La ventaja del mensajero del agente mail.ru es que los desarrolladores lo lanzaron con éxito para reemplazar al popular ICQ. La versión web de la aplicación complementa perfectamente el programa, permitiéndole comunicarse con amigos independientemente de su ubicación, capacidad de instalar el programa, etc. Todo lo que necesita es acceso a una computadora con acceso a Internet en la que pueda ejecutar su Buzón. Después de esto, el usuario tiene numerosas oportunidades para comunicarse con amigos y familiares.

En la versión principal del programa, el usuario tiene acceso a muchos valiosos y características útiles. Entonces, aquí puedes realizar llamadas de audio o video a todos los usuarios de Messenger. Para ello debes ir a la agenda de contactos, seleccionar la persona que te interesa y seleccionar el tipo de llamada: voz o videollamada.

Usando el programa, el usuario puede llamar regularmente números de teléfono. En el panel de control de la derecha hay una imagen de un auricular de teléfono. Debe hacer clic en él, después de lo cual se abrirá la ventana de marcación. Si el usuario quiere llamar gratis, debe marcar el número de la persona que utiliza el mensajero. De lo contrario deberá pagar por el servicio. Para hacer esto, necesita recargar su saldo a través de su cuenta personal.

Abrir Área personal, debes abrir el menú e ir a “Configuración”. Además de la posibilidad de recargar su cuenta, aquí puede cambiar la configuración de llamadas, trabajar con tarifas y realizar muchas otras funciones.

Desafortunadamente, la posibilidad de realizar llamadas de voz o video no está disponible en la versión web de mail.ru Agent Messenger. Esta versión del programa está implementada para el intercambio de usuarios. mensajes de texto y se puede utilizar en los casos en los que no es posible instalar un cliente completo y utilizarlo. Podría ser la computadora o dispositivo de otra persona con versión desactualizada SO.

Requisitos del sistema

  • Sistema operativo: Windows 7, 8, 10

Cómo instalar el agente Mail.Ru

Para utilizar la versión en línea del Agente mail.ru no es necesario instalar la versión de escritorio de la aplicación en su computadora. El programa funciona a través de cualquier navegador moderno, actualizado a ultima versión- , y muchos otros. Basta con ingresar su nombre de usuario y contraseña en el correo Mail.ru, iniciar sesión en su buzón e iniciar el Agente haciendo clic en el panel en la esquina inferior derecha.

Para otros sistemas

, empresas de TI

Se lanza Mail.ru Group, cuyos activos incluyen Agent e ICQ Messengers Nuevo producto TamTam, informa Kommersant. Se trata de una aplicación de mensajería que integra una base de 290 millones de usuarios registrados en Odnoklassniki.

El nuevo mensajero no fue creado desde cero. Sus autores reelaboraron creativamente el concepto de una aplicación similar, OK Messages, lanzada en julio de 2016. Según Vladimir Kochetkov, autor y director del proyecto TamTam, esto permitió fabricar un nuevo producto de forma económica y rápida. El desarrollo de TamTam llevó cuatro meses.

"OK Messages" fue creado por el equipo de desarrolladores de la red social "Odnoklassniki" (parte del holding Mail.ru Group). En febrero de 2017 aplicación movil"OK Messages" fue instalado por alrededor de un millón de propietarios de teléfonos inteligentes en plataforma Android y más de 300 mil propietarios dispositivos móviles Manzana. Ahora estos usuarios podrán reemplazar el messenger con TamTam instalando actualización especial de Mail.ru.

“TamTam se lanza con una audiencia inicial, existe la oportunidad de encontrar amigos entre millones de usuarios y esa es su principal ventaja. Ahora que las capacidades de muchos programas de mensajería instantánea son similares, lo principal para el usuario no es sólo una función, sino las personas con las que se comunica en la aplicación”, opina Vladímir Kochetkov.

El servicio le permitirá mantener correspondencia en mensajes personales y en chats grupales, compartir pegatinas con animación GIF, enviar fotos, grabaciones de video y audio. Messenger permite comunicarse no solo con amigos, sino también con suscriptores. Mail.ru Group afirma que la aplicación debería funcionar de manera estable incluso con una conexión a Internet débil. Ya está disponible en Tienda de aplicaciones y Google Play.

TamTam se integrará con otros proyectos de la empresa. Como ejemplo exitoso dicha integración, cita la fuente de Kommersant mensajero chino Nosotros chateamos. Su audiencia se acerca a los mil millones de personas. WeChat es una de las plataformas de mayor éxito comercial. Con su ayuda en China, los usuarios pueden, por ejemplo, concertar una cita con el médico, pagar facturas y encargar productos.

Por cierto, WeChat tiene competidor digno– Línea de mensajería japonesa. Ambos mensajeros se lanzaron en Asia, donde tienen una gran cuota de mercado. Por supuesto, en Japón y Corea, en las regiones de origen de Line, el mensajero logró hacerse un hueco muy fuerte, incluso gracias a una publicidad potente y a una gran cantidad de productos con la marca Line Friends.

El futuro de TamTam dependerá de si encuentra una identidad propia que le distinga de otros mensajeros. "Tal vez sea correcto alejarse de la marca OK y crear un proyecto multiplataforma que pueda promocionarse tanto a través de VK como, por ejemplo, a través del correo Mail.ru", dice Svetlana Sukhanova, analista senior de Sberbank CIB.

Las audiencias de Odnoklassniki y Viber se superponen significativamente, y si TamTam atrae a los usuarios de Odnoklassniki, entonces Viber puede perder entre el 10 y el 15% de su audiencia, señala Ilya Korolev, gerente de cartera del Fondo de Desarrollo de Iniciativas de Internet.

El desarrollo del tercer mensajero del grupo Mail.Ru puede verse afectado por la nueva legislación. Ayer los diputados de la Duma estatal presentaron un proyecto de ley que prohíbe el anonimato de los usuarios de mensajería. La identificación de los usuarios de la red debe ser realizada por el operador de telecomunicaciones utilizando número de suscriptor, que se encuentra en el acuerdo de identificación celebrado por el organizador del intercambio. mensajes instantáneos con el operador de telecomunicaciones.

El 24 de mayo se presentó a la Duma del Estado un proyecto de ley sobre la necesidad de imponer multas por negarse a cumplir con las disposiciones anteriores. Para los ciudadanos, la multa es de 3 a 5 mil rublos, para los funcionarios, de 30 a 50 mil rublos. entidades legales- de 800 mil a 1 millón de rublos.

¡Hola Habr! Mi nombre es Yuri Buyanov, soy el desarrollador del mensajero TamTam. Hoy quiero contarles un poco sobre cómo se creó y cómo funciona desde adentro. TamTam es nuevo mensajero Mail.Ru Group, que fue desarrollado en base a la aplicación OK Messages. En 2016, creamos un mensajero separado en Odnoklassniki para aquellos que a menudo se comunican en las redes sociales y les resulta más conveniente hacerlo usando una aplicación separada.


El experimento resultó exitoso, por lo que a principios de año decidimos desarrollar "OK ​​Messages" como un mensajero separado de la red social bajo marca propia TamTam, pero ya con una audiencia inicial establecida. Durante las primeras semanas después del lanzamiento, aparecieron decenas de miles de canales en TamTam y la audiencia continuó comunicándose tan activamente como en OK Messages. Esto fue posible gracias en parte a trabajo rapido aplicaciones y varios trucos tecnicos. Te contaré más sobre ellos.

Dificultades que inspiraron ideas.

Empecemos por las dificultades: ellas fueron las que nos trajeron ideas, que luego se implementaron en el producto y finalmente se convirtieron en las ventajas de la aplicación. Se trata principalmente de rapidez y trabajo estable Mensajero.


La audiencia inicial de TamTam es de diferentes partes del mundo, incluidas aquellas con cobertura irregular. red móvil(y a veces con ausencia total internet fijo). En algunos países de la CEI, fuera de las grandes ciudades, la conexión 2G es, de hecho, la única ventana a Internet.


También era importante que no todos los usuarios potenciales de TamTam se quedaran sin comprar nuevo iPhone o CALIENTE NUEVO de Samsung. Según las estadísticas, el dispositivo iOS más popular entre nuestros usuarios es el iPhone 5s, y el dispositivo Android es económico. lanzamiento de galaxia 2014-2015. Al mismo tiempo, TamTam tiene una audiencia bastante joven: el 28% de la audiencia diaria son personas de entre 27 y 34 años, y más de la mitad de los usuarios (54%) tienen menos de 35 años.


Por lo tanto, una de las áreas prioritarias en el desarrollo del Messenger para nosotros desde el principio fue optimizar la aplicación en términos de cómo velocidad, entonces redes. En definitiva, era necesario hacer que la aplicación funcionara desapercibida para los usuarios en cualquier nivel de conexión. Y con cualquier crecimiento de la audiencia también. TamTam muestra buenos números en los primeros meses: el número de instalaciones ya se acerca a los 3 millones y el número de canales supera los 50.000.

Cómo hicimos que la aplicación fuera rápida

El rendimiento desde el punto de vista del usuario es principalmente la velocidad de lanzamiento. El tiempo que pasa antes de que se muestre contenido nuevo (por ejemplo, al abrir un chat con un mensaje nuevo mediante notificación push). Funcionamiento fluido en general, en particular el desplazamiento. En el equipo de iOS intentamos probar y medir el rendimiento en iPhone 5 y iPhone 4S. El equipo de Android tiene un inicio de sesión Galaxy S3 y Megafon por 1000 rublos. Como resultado, en dispositivos más potentes la aplicación simplemente vuela.


En cada construcción de prueba Puede habilitar el contador de fotogramas por segundo y la duración de las operaciones en los cuellos de botella se registra en el sistema de registros y estadísticas.



Por ejemplo, este gráfico muestra el tiempo desde que se inicia la aplicación cuando se abre mediante push hasta que el usuario la ve. mensaje específico en la pantalla. Dos caídas en el gráfico corresponden a la inclusión de push de contenidos para la mitad y todos los usuarios.


A pesar de la abundancia de herramientas y métricas, la principal herramienta para evaluar el rendimiento de las aplicaciones siguen siendo los sentimientos subjetivos. Nadie puede decir exactamente qué retraso en milisegundos es aceptable al abrir una pantalla de mensaje, pero casi todos pueden decir si sienten que una aplicación "tartamudea".


¿Cómo optimizamos? En primer lugar, tomamos todo lo que podemos del hilo principal: trabajar con la base de datos (más sobre esto a continuación), trabajar con la red, serialización y deserialización de datos, procesamiento de imágenes e incluso cálculos relacionados con el diseño del texto.


Cuando iniciamos una aplicación o abrimos una pantalla de chat, realizar operaciones pesadas en segundo plano no evitará un retraso visible. Por lo tanto, algunas operaciones, como el diseño de burbujas, aún deben optimizarse a tiempo, mientras que otras se realizan mejor inmediatamente después de recibir un mensaje y almacenar en caché el resultado de su ejecución en la base de datos.


Al elegir soluciones de terceros y bibliotecas en cuellos de botella, también intentamos tener en cuenta la velocidad y la compacidad. En particular, es por eso que elegimos MessagePack (y específicamente hicimos un punto de referencia de diferentes implementaciones para iOS), cambiamos la biblioteca para mapear datos en objetos de Mantle a YYModel y nos decidimos por lz4 como algoritmo de compresión de tráfico.


Es más, para lograr buen funcionamiento de la interfaz Optimizamos sintomáticamente el renderizado:

  • evitamos el renderizado fuera de pantalla, que carga el procesador;
  • cambiar el tamaño de las imágenes por adelantado en segundo plano en lugar de usar UIViewContentMode estándar trabajando en el hilo principal;
  • hacer que nuestras jerarquías de UI sean “planas” y más simples;
  • Almacenamos en caché aquellos objetos y datos cuya creación es demasiado costosa. Desde la altura de las celdas de texto hasta YYTextLayout (el objeto que almacena información de visualización de texto en la biblioteca YYText), NSAttributedStrings e incluso las propias UIViews.

Todas las listas tienen diseño manual sin diseño automático. Aunque también nos encanta el diseño automático y utilizamos el diseño declarativo usando Masonry en el código, pero solo cuando sea apropiado.

Sin conexión y trabajando con mala conexión a Internet

En trabajando con la red Intentamos minimizar el tráfico y la latencia eligiendo un protocolo rápido y compacto y un almacenamiento en caché agresivo.


Utilizamos únicamente sockets TCP y el protocolo binario como forma de comunicarnos con el servidor. Esto nos permite recibir actualizaciones del servidor en tiempo real y trabajar en un modo de “solicitud-respuesta” más familiar.


La propia API, es decir, un conjunto de comandos sobre un protocolo de bajo nivel, se puede implementar en el futuro, si se desea, sobre otro transporte, por ejemplo, en sockets web. Con todo esto no hace falta que toquemos la lógica de nivel superior de la aplicación.



Los paquetes en sí constan de un encabezado de longitud fija con información de servicio: código de comando, versión del protocolo, longitud de la carga útil. Las respuestas a las solicitudes pueden venir en diferentes órdenes y mezclarse con comandos del servidor, por lo que el encabezado contiene un número de secuencia que le permite asociar la solicitud y la respuesta.


Decidimos probar el paquete de mensajes como formato de carga útil. No requiere una definición de esquema estricta, es muy compacto y tiene bibliotecas de serialización bastante rápidas para muchas plataformas. Básicamente, es una versión binaria eficiente de JSON. Para reducir aún más el consumo de tráfico, comprimimos la carga útil utilizando el algoritmo lz4. También lo elegimos por su velocidad y baja carga de CPU y batería.


Una de las principales formas de garantizar trabajo normal aplicaciones en condiciones mala red - soporte máximo para el modo fuera de línea. La aplicación debe almacenar en caché la mayor cantidad de datos posible, dedicar menos tiempo y tráfico a la sincronización y poder posponer el envío de comandos hasta que haya una conexión disponible. Además, la conexión puede restablecerse incluso la próxima vez que se inicie la aplicación, es decir, todas las tareas de envío pendientes deben poder guardarse en la base de datos.


Después de la conexión, el cliente se autentica, al mismo tiempo que solicita datos críticos: configuración, lista de contactos y chats con los últimos mensajes. Guardamos la marca de tiempo. última actualización(V sistema de servidor cuenta regresiva) y páselo en la solicitud para recuperar solo lo que realmente ha cambiado. Una vez establecida la conexión, podremos recibir actualizaciones en tiempo real: por ejemplo nuevos mensajes o cambios en los datos de contacto.


Con el historial de mensajes del chat todo es un poco más complicado. No tiene sentido descargar el historial completo de todos los chats por adelantado, pero guardamos en caché lo que recibimos una vez e intentamos no volver a solicitarlo. Si miramos qué partes del historial de chat están almacenadas en caché, podemos ver que hay "lagunas" en el historial. Por ejemplo, al actualizar la lista de chats después de iniciar sesión, vimos que el último mensaje del chat había cambiado. Al mismo tiempo, tenemos una sección (o varias secciones) del historial de chat en la base de datos, almacenada en caché durante sesión anterior. Además, no sabemos cuántos mensajes hay en el servidor entre Ultimo mensaje en el chat y el mensaje anterior en caché, y esto añade sus propias dificultades.


Por lo tanto, además de los mensajes en sí, almacenamos metadatos sobre fragmentos continuos del historial, fragmentos que almacenamos en caché. Al desplazarnos por el chat, utilizamos esta información: nos ayuda a determinar si cargar siguiente página desde la base de datos o enviar una solicitud al servidor. O tal vez hacer ambas cosas. Al recibir nuevas secciones del historial del servidor, estos fragmentos cambian de tamaño y se fusionan entre sí (si el cliente comprende que la sección del historial recién recibida conecta dos fragmentos separados disponibles en la base de datos).


Dado que muchas operaciones se pueden realizar sin conexión, hemos desarrollado un mecanismo para guardar tareas. Puede iniciar tareas, esperar a que se completen, guardar su estado en la base de datos o cargarlas y ejecutarlas cuando se inicia la aplicación.


Las tareas se pueden almacenar en la base de datos; encapsulan toda la lógica de ejecución. Dado que las dependencias de otras tareas y del estado de la aplicación pueden ser bastante complejas, el seguimiento de ellas también se implementa en las propias tareas. Por ejemplo, la tarea de enviar un mensaje con una foto debe asegurarse de que la foto se procese, se cargue en la CDN (tareas separadas son responsables de esto), espere (si es necesario) conexión de red y solo entonces intente enviar directamente el mensaje.

Dos trucos para un funcionamiento fluido de la aplicación

Les contaré un poco sobre un par de trucos que utilizamos para sortear las limitaciones del sistema que nos impedían crear una interfaz amigable y fluida. Usando una aplicación de iOS como ejemplo.


Una de las dificultades durante el desarrollo fue pergamino sin fin en el chat, es decir, cargar el historial de mensajes sin que el usuario lo note al desplazarse hacia arriba en el chat. En el 99% de los casos, el usuario se encuentra en la parte inferior del chat y quiere desplazarse hacia arriba para leer mensajes antiguos. Aquí nos enfrentamos a dos problemas.


En primer lugar, llegar constantemente a la parte superior de la lista de mensajes y esperar a que se cargue cada pocas pantallas es molesto. Este problema no fue muy difícil de resolver: no esperamos hasta que el usuario se desplace hasta la parte superior y vea el "giro" allí, sino que intentamos solicitarlo con anticipación. paginas anteriores historial mientras se desplaza: tanto desde el caché local como desde el servidor. Si hay mensajes en el caché o en conexión rápida el usuario simplemente no tendrá tiempo de desplazarse hasta la parte superior cuando podamos mostrar una nueva pila de mensajes.


El segundo problema resultó ser mucho más grave: después de insertar dicha página al principio de la lista de mensajes (creada en base a UITableView), el contentOffset para el área ya cargada se desplaza y el desplazamiento "salta". Por supuesto, podemos calcular el tamaño de la página insertada y volver a cambiar el contentOffset, pero esto provoca una parada abrupta en la animación de desplazamiento, lo cual es feo y desanima al usuario. Intentamos hacer esto diferentes caminos, incluyendo cosas como el seguimiento del tamaño del contenido de la tabla a través de KVO, pero invariablemente fallaba: UITableView simplemente está crónicamente mal equipado para agregar elementos al frente de una lista.


Finalmente, después de varios intentos, pudimos resolver este problema usando una especie de “truco”: volteamos la lista usando .transform y luego volteamos cada celda en la dirección opuesta. El usuario no nota nada, pero ahora el contentOffset se cuenta desde abajo y la carga de mensajes antiguos no lo afecta de ninguna manera.


Esta solución tiene una serie de trampas, pero también logramos sortearlos y no nos molestan. Primero, debe convertir los índices de las celdas invertidas en índices en su modelo de datos y viceversa. Si tienes más de una partición, los cálculos serán muy complejos, por lo que es mejor limitarte a una. Por supuesto, esto nos impide utilizar encabezados de secciones flotantes, que serían útiles en la pantalla de chat, por ejemplo, para mostrar separadores por días del historial. Pero los divisores flotantes no resultaron tan difíciles de hacer a mano.


En segundo lugar, en casos raros pueden surgir dificultades al calcular las coordenadas dentro de las celdas, por ejemplo cuando se trabaja con gestos, pero todas ellas también se pueden solucionar. En tercer lugar, al cargar datos hacia abajo, el problema vuelve, pero la carga al desplazarse hacia abajo ocurre muy raramente, por lo que para nosotros esto no es un problema muy grande. En este caso, no realizamos una carga previa al desplazarnos, sino que esperamos hasta que el usuario se desplace hasta el final de la tabla, luego mostramos el indicador de carga, actualizamos la tabla y cambiamos el contentOffset.


El segundo desafío que encontramos fueron las actualizaciones de listas animadas y asincrónicas. si varios actualizaciones independientes ocurren casi simultáneamente (por ejemplo, la página del historial se carga en la parte superior del chat y llega un nuevo mensaje en la parte inferior), entonces los datos utilizados por el delegado tableView pueden cambiar, incluso si la animación de la actualización anterior no ha terminado. .


Esto puede hacer que UITableView muestre la celda incorrecta o falle por completo: esto es aún más probable si está utilizando el truco anterior. Por supuesto, puede utilizar el método reloadData, que es sincrónico en UITableView, pero esto provoca parpadeos, detener el desplazamiento y otras cosas que irritan al usuario.


Especialmente para estos casos, creamos una cola separada para el procesamiento secuencial de dichas actualizaciones. Todos los cambios en el modelo y su visualización en la interfaz de usuario se realizan dentro de bloques que están en cola. En este caso, el bloque puede bloquear la cola al inicio de una animación o alguna otra operación asincrónica y desbloquearla cuando se complete. Por lo tanto, todo el trabajo con la tabla se produce de forma secuencial y los datos no cambian hasta que se completa la animación anterior.

Persistencia

Para almacenar en caché los datos en el cliente iOS, utilizamos la biblioteca YapDatabase.


YapDatabase es un almacén de valores clave además de SQLite con un conjunto muy grande de capacidades. Esta biblioteca me parece mucho más sencilla y flexible que CoreData. Aquí puede seleccionar el mecanismo para serializar objetos en la base de datos: de forma predeterminada es NSCoding y todavía usamos el mismo MessagePack.


YapDatabase no requiere herencia de objetos de clase base o implementación de algún protocolo, no vincula objetos a un contexto. La lectura y la escritura se realizan mediante transacciones sincrónicas o asincrónicas.


Y con la ayuda del sistema de extensión, están disponibles las mismas capacidades que en una base de datos "real": consultas SQL arbitrarias e indexación de varios campos, búsqueda de texto completo, suscripción a cambios (como en NSFetchedResultsController), cifrado de complementos, trabajo con CloudKit, etc. Hola mundo, no daré ejemplos de cómo trabajar con la base de datos aquí, están en la wiki de github.


Para mi gusto, YapDatabase mejora la productividad y la claridad del código, pero a algunos de mis colegas no les gusta mucho. Y se pueden entender: después de trabajar con CoreData durante mucho tiempo, cambiar a YapDatabase realmente requiere un poco de reflexión.


Además, cuando trabajo asincrónico Con una base de datos a través de múltiples conexiones, es necesario tener una buena comprensión de cómo la base de datos procesa las solicitudes de lectura y escritura en paralelo: a través de una o diferentes conexiones. Y recuerde también que los objetos se actualizan en la base de datos en su conjunto. No puedes simplemente guardar la copia que leíste hace algún tiempo y la modificaste. Debe leer un objeto de la base de datos, cambiarlo según sea necesario y volver a escribirlo en una transacción. De lo contrario, podría escribir accidentalmente datos obsoletos en la base de datos.


En general, trabajar con la base de datos encaja muy bien en nuestro estilo reactivo de codificación. Los patrones de transacciones asincrónicas (lectura/escritura/modificación de un objeto separado) son muy fáciles de encapsular, por ejemplo, en señales de ReactiveCocoa, e integrar el trabajo con la base de datos en una cadena con el envío y procesamiento de solicitudes de red.

Arquitectura de aplicaciones

No hablaré mucho de arquitectura, pero, como dicen, no me permiten no mencionar sus leyes del género. Ya existen muchos informes y artículos sobre MVVM (por ejemplo, un tutorial clásico en la versión para Objective-C y RAC: parte 1, parte 2, o sobre la implementación de este patrón para Swift).


Bajo la capa ViewModels hay un conjunto de servicios que implementa (y, si es posible, encapsula) la lógica de negocios, la lógica de protocolo y el almacenamiento en caché. La navegación en la aplicación se realiza mediante el llamado enrutador, es decir, un objeto que encapsula el código necesario para abrir una pantalla determinada. De hecho, hubo varios enrutadores en el proceso, ya que el enrutador tiende a convertirse en una especie de Objeto Divino muy gordo. Por eso, siempre que sea posible, intentamos descomponerlo. Por ejemplo, un enrutador independiente es responsable de todo el proceso de registro/autenticación del usuario.


Por la experiencia de proyectos anteriores, sabíamos que la inyección de dependencia simplifica enormemente la estructura de la aplicación y facilita enormemente los cambios en la arquitectura. Al principio, utilizamos el marco Typhoon para DI, pero mientras optimizamos el tiempo de inicio de la aplicación, descubrimos que resolver las dependencias tomó un tiempo prohibitivamente largo. por mucho tiempo al inicio de la aplicación (unidades de segundos por dispositivos débiles). Por lo tanto, cambiamos a DI manual mediante inyección basada en propiedades. No diría que hay más código: el nivel de servicio en una aplicación generalmente se configura en una clase y toda la configuración del servicio es fácil de leer. Para las extensiones de compartir e imessage, por supuesto, los servicios se configuran por separado, ya que en este caso se necesita un conjunto mucho menor de ellos.


Por lo tanto, la coherencia del código inicialmente no era muy grande, e incluso después de bastante largo tiempo Después del inicio del desarrollo, pudimos mover algunos de los servicios y el código de mantenimiento a biblioteca separada(más precisamente, incluso un conjunto de bibliotecas), que implementa la mayor parte de la lógica interna del mensajero, incluido el trabajo con el protocolo y el almacenamiento en caché, y que puede integrarse en otras aplicaciones.

Agregar etiquetas


Arriba