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:
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í .
La aplicación Reddit se creó con
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 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.
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ó.
Con tantos usuarios, experimentos y funciones, es mejor controlarlos de forma remota. Reddit hace un gran trabajo al controlar estas funciones de forma remota.
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.
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.
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.
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:
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.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.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.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 | 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 |
| 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 😄. |
Me gustaría señalar un par de puntos a modo de conclusión de este experimento de desmontaje.