paint-brush
Desmantelando la aplicación iOS de Reddit: información sobre API, rendimiento, seguridad y experimentos A/Bpor@hackercm3ebf0le00003b7n7h2a5k7d
Nueva Historia

Desmantelando la aplicación iOS de Reddit: información sobre API, rendimiento, seguridad y experimentos A/B

por 7m2024/11/26
Read on Terminal Reader

Demasiado Largo; Para Leer

Mi curiosidad me llevó a analizar el funcionamiento detrás de escena de la aplicación Reddit iOS y me reveló información interesante sobre las API de Reddit.
featured image - Desmantelando la aplicación iOS de Reddit: información sobre API, rendimiento, seguridad y experimentos A/B
undefined HackerNoon profile picture
0-item

Me pareció que la experiencia con la aplicación iOS de Reddit era mejor que la versión web, así que pensé en comprobar cómo carga los datos tan rápido. Aquí está el análisis de la aplicación iOS de Reddit.


A continuación se presentan algunos puntos destacados:

  • Utiliza autenticación basada en token.
  • Utiliza las API GraphQL para casi todo, desde la configuración y los experimentos hasta la información de las publicaciones.
  • Supervisa el rendimiento de su sistema API tal como lo experimentan sus usuarios utilizando una API llamada w3-reporting.
  • En la mayoría de las llamadas a la API de GraphQL, solo se pasa el nombre de la operación sin variables. Supongo que están usando middleware para abstraer la configuración de las variables desde el front-end. Un servicio de back-end completa la información en función del nombre de la operación.
  • Reddit utiliza Web Socket para la función de comentarios en vivo.


Aquí se muestra un desglose detallado de las llamadas a la API. Utilicé la aplicación de escritorio de Requestly para interceptar la aplicación iOS de Reddit. Las instrucciones de configuración se proporcionan aquí .

Tecnología utilizada

La aplicación Reddit se creó con

  • La aplicación iOS de Reddit utiliza API GraphQL para cargar todo el contenido.
  • La autenticación basada en token se utiliza para validar a los usuarios.
  • Monitoreo del rendimiento mediante informes sobre el rendimiento de la API en el extremo del usuario.
  • Los comentarios en vivo son compatibles con WebSocket.
  • Configuración dinámica para controlar de forma remota el comportamiento de la aplicación sin implementar nuevas versiones.
  • Experimentos dinámicos para controlar experimentos de forma remota, sin necesidad de una nueva implementación para cambiar el estado de un experimento.

Mejor experiencia de usuario con precarga

La pregunta principal que tenía era cómo la aplicación funciona tan rápido y la encontré al verificar la respuesta de la API FeedPostDetailsByIds . Esta API se llama en la pantalla de inicio con los identificadores de las publicaciones que se muestran y viene con información detallada que se muestra después de hacer clic en la publicación. Esta precarga de las publicaciones principales ayudó a mostrar instantáneamente la pantalla de detalles de la publicación sin ningún cargador.


  • Las publicaciones precargadas se muestran en el feed.
  • El tiempo de respuesta de las API también es muy rápido.

Seguridad de las API de GraphQL

Las consultas GraphQL consisten en los datos y la estructura de la respuesta necesaria. El nombre de la operación es generalmente opcional. La mayoría de las API de Reddit solo tienen nombres de operaciones en las consultas y las variables están disponibles solo cuando hay variables o filtros en pantalla, como feed con opciones de publicaciones recientes y populares.


Esto otorga menos control a los desarrolladores frontend para realizar cambios de forma independiente, pero más control sobre el uso indebido de las API para obtener datos innecesarios después de todo, su API está orientada al usuario.

Experimentos controlados a distancia

Ejecutar experimentos en aplicaciones nativas de iOS es difícil, ya que es necesario volver a implementarlos para habilitarlos o deshabilitarlos, pero Reddit ha configurado la aplicación de tal manera que los experimentos se pueden controlar de forma remota. Todos los experimentos se cargan en una API junto con sus valores y estados. La aplicación activa automáticamente la variante del experimento que le asignó.

Control de funciones basado en banderas

Con tantos usuarios, experimentos y funciones, es mejor controlarlos de forma remota. Reddit hace un gran trabajo al controlar estas funciones de forma remota.

Llamada a la API GetAllDynamicConfigs como se muestra en Requestly


Cada vez que se inicia la aplicación, se llama a una API de configuración para cargar más de 400 variables de configuración. En función de estas variables, se muestran diferentes funciones y variantes de las funciones.

Respuesta de la API de configuraciones

El secreto de los karmas

La API con el nombre de operación GetTopKarmaSubreddits obtiene la lista de los principales subreddits con puntos de karma obtenidos en cada uno. Esta API revela cuántos comentarios y karma de publicaciones hemos obtenido gracias a nuestra actividad en cada subreddit. Nunca pude encontrar esta información dentro de la interfaz web y móvil de Reddit.


Karma para cada subreddit

Alcance de la mejora

Mientras leía las API para encontrar qué tipo de datos aportan, descubrí que la API SubredditFeedElements carga el feed del subreddit seleccionado, pero con cada publicación, tiene un JSON anidado con información detallada del subreddit. Esta información es redundante y se puede eliminar para reducir la carga de red de la API y mejorar aún más su rendimiento.


Nota: La API SubredditFeedElements ahora fue reemplazada por la API SubredditFeedSdui y el problema está solucionado.

Utilice la IA para obtener información

Intenté usar ChatGPT para obtener información de las API. Así que creé un archivo con todas las API con su curl y sus respuestas. Subí este archivo a un CustomGPT para poder poner cualquier tipo de consulta. Me dio algunas ideas que eran evidentes, como qué tipo de uso podría tener una API y la estructura de la respuesta, pero me sorprendió mucho, probablemente debido a que hay muchas API o porque no soy un experto en generar sugerencias. Algunas de las ideas que me dio la IA:


  1. API GetAllExperimentVariants : muchos experimentos tienen nombres de "variantes" específicos, incluidas opciones como enabled , variant_1 , control_model y one_feed_ph_bridge_new_users . Esta segmentación sugiere que Reddit está probando funciones en segmentos de usuarios específicos para determinar su impacto. Por ejemplo, el experimento d2x_avatar_in_comments_loggedin tiene dos variantes, loggedin y loggedout , que posiblemente prueben la función en función del estado de autenticación del usuario.
  2. API GetAllExperimentVariants : los experimentos incluyen hybrid_video_rollout_android_v2 , active_sales y gql_google_maps_integration , que apuntan a una amplia gama de pruebas de funciones que cubren la funcionalidad de video, ubicaciones de anuncios, mejoras de la interfaz de usuario e integraciones de terceros.
  3. API GetAccountDetails : la respuesta de la API contiene varios campos que detallan el estado de la cuenta del usuario, como isSubredditCreationAllowed , isNameEditable , isPasswordSet y el estado de moderador del usuario. Además, incluye suspensionExpiresAt y isSuspended , que indican si una cuenta está actualmente suspendida o restringida.

Lista de API

A continuación se muestra una lista de las API de GraphQL que estudié para comprender cómo funciona Reddit. También había otras API, como las de autenticación, generación de informes, etc. No las incluí en esta lista.

Pantalla

API de GraphQL
(nombre de la operación)

Descripción

Hogar

Obtener todas las configuraciones dinámicas

Carga más de 400 parámetros de configuración según los cuales funcionan las distintas funciones de la aplicación. La configuración se presenta en el formato de valor clave habitual junto con el tipo de valor, que puede ser JSON, flotante, cadena, etc.


Obtener todas las variantes del experimento

La solicitud contiene información sobre la aplicación y el dispositivo para asignar experimentos destinados al dispositivo y la versión de la aplicación. La respuesta contiene una lista de todos los experimentos con el ID, el nombre del experimento, la versión y el estado.


Obtener cuenta

Carga todos los detalles del usuario que inició sesión.


InicioFeedSdui

Carga las primeras publicaciones con el mínimo de detalles para mostrar en la página de inicio.


FeedPostDetallesPorID

Precarga las publicaciones usando identificadores con todos los detalles, en caso de que un usuario haga clic en la publicación.


DescubrirBarRecomendaciones

Descubra los datos de la barra.


Suscripción Premium de Usuario

Datos relacionados con la suscripción premium del usuario


Obtener elegibilidad para anuncios de usuario

Obtiene la elegibilidad publicitaria del usuario y cualquier preferencia.


Recuento de insignias

Información sobre las insignias obtenidas por el usuario.




Página de subreddit

Canales de subreddit

Carga todos los detalles básicos sobre la comunidad, como descripción, íconos, contadores, tipos de publicaciones permitidos y colores.


SubredditTaxonomíaTemas

Carga la categoría de la comunidad y muestra un texto como si cargara la comunidad r/software y mostrara el número 20 en Software y aplicaciones.


¿Está pendiente la invitación?

Como sugiere el nombre, verifica si hay una invitación pendiente, pero no estás seguro exactamente de cuál.


Canales de subreddit

Carga los canales de chat del sub-reddit, revisé muchos subreddits pero no pude encontrar ninguno.


Redditors bloqueados

Trae datos si el usuario está bloqueado.


Obtener moderadores

Obtiene la lista de mods.


Obtener estilos y widgets estructurados

Esta API brinda información sobre el estilo, las reglas y los detalles de la comunidad.


Recomendaciones de la comunidad relacionadas con Fetch

Esta API trae comunidades relacionadas.


Silenciamiento de subreddit

Comprueba si el subreddit está silenciado.


Elementos de feeds de subreddit

Carga el feed del subreddit. Toma los filtros y las opciones de diseño seleccionados para el subreddit. Incorpora todos los detalles sobre las publicaciones que se mostrarán en el feed.


PostInfoByIdComentarios

Esta solicitud precarga los comentarios de la primera publicación únicamente.




Página de publicación

Obtener estado de emojis personalizados

Esta API se llamó con el ID de sub-reddit y carga el estado de los emojis personalizados en sub-reddit. No está muy claro por qué se llama a esta API, pero la he visto en muchas ocasiones. La respuesta fue isEnabled: false en todos los casos que probó.


ObtenerSubredditLogroFlairsEstado

De manera similar al estado de emoji, toma la identificación de subreddit y obtiene una respuesta como isEnabled: false. No me queda claro el propósito de esto.


PostInfoByIdComentarios

Esta API se utiliza para cargar comentarios de la publicación utilizando el ID de publicación pasado en la solicitud.


ComentariosPáginaAnuncios

Carga el anuncio justo encima de los comentarios.




Página de perfil

RedditorPorNombre

Carga los detalles del perfil del usuario que inició sesión.


Configuraciones de PostSet

Número de publicaciones a cargar.


Obtener TopKarmaSubreddits

Obtén la lista de los mejores subreddits con puntos de karma en cada comunidad, esta API revela cuántos comentarios y karma de publicaciones hemos obtenido de nuestra actividad en cada subreddit.


Feed de perfiles de usuario

El feed del perfil de usuario que contiene comentarios y publicaciones.


TrofeosPúblicosUsuario

Listado de logros y trofeos obtenidos por el nombre de usuario pasado en la solicitud con id, nombre e imagen a mostrar.


Perfil de propinas migrado

Detalles sobre el perfil de propinas. No he usado mucho esta función. Me mostró un saldo de 0 en mi perfil 😄.

Conclusión

Me gustaría señalar un par de puntos a modo de conclusión de este experimento de desmontaje.

  • Las API de Reddit no son muy rápidas, sino que utilizan la precarga para brindar una mejor experiencia al usuario.
  • El trabajo de las API nunca está completo, incluso los ingenieros de Reddit tienen trabajo que hacer para mejorarlas aún más.
  • Mantener las configuraciones de aplicaciones y experimentos de forma remota puede brindar un buen control sobre la experiencia del usuario.
  • Los ingenieros de Requestly hicieron un gran trabajo al mostrar el nombre de la operación con cada solicitud GraphQL, haciendo la vida de los desarrolladores mucho más fácil.