Arquitectura de Comunicación de AltStore
AltStore opera mediante un sistema cliente-servidor, compuesto por una aplicación móvil y un servicio de escritorio llamado AltServer. Esta separación permite evadir las retsricciones del sandbox de iOS, habilitando un intercambio de datos seguro entre el ordenador y el dispositivo.
Componentes Clave
- AltServer: Servicio de fondo en el escritorio que gestiona las solicitudes de firma e instalación de aplicaciones.
- Conexión XPC: Framework subyacente para la comunicación entre procesos.
- Protocolo Personalizado: Define el formato de mensajes y reglas de interacción entre cliente y servidor.
Implementación de XPC para Comunicación Segura
La tecnología XPC de Apple es fundamental para la comunicación segura entre AltServer y el dispositivo iOS. A continuación, se muestra un ejemplo refactorizado del manejador de conexiones:
class GestorConexionesIPC: NSObject, ProtocoloManejador {
private let colaAsincrona = DispatchQueue(label: "ipc.altstore.escucha", qos: .utility)
private let serviciosEscucha = ConexionesIPC.identificadoresServicio.map { NSXPCListener.crearListener(servicioMach: $0) }
func listener(_ listener: NSXPCListener, debeAceptarConexion nuevaConexion: NSXPCConnection) -> Bool {
nuevaConexion.interfazExportada = NSXPCInterface(with: ProtocoloIPC.self)
let conexion = ConexionIPC(nuevaConexion)
nuevaConexion.manejadorInvalidacion = { [weak self, weak conexion] in
guard let self, let conexion else { return }
self.terminarConexion(conexion)
}
self.delegadoConexiones?.conexionEstablecida(conexion)
return true
}
}
Protocolo de Aplicación Personalizado
Definido en ProtocoloServidor.swift, este conjunto de reglas estructura las solicitudes y respuestas para operaciones como instalación y gestión de perfiles:
public enum SolicitudServidor: Decodable {
case datosAnisette(SolicitudDatosAnisette)
case prepararAplicacion(SolicitudPrepararApp)
case iniciarInstalacion(SolicitudIniciarInstalacion)
case instalarPerfiles(SolicitudInstalarPerfiles)
case eliminarPerfiles(SolicitudEliminarPerfiles)
case eliminarAplicacion(SolicitudEliminarApp)
case habilitarEjecucionCodigo(SolicitudHabilitarCodigo)
case desconocido(identificador: String, version: Int)
}
Gestión de Conexiones
El gestor de conexiones inicializado en GestorSolicitudes.swift coordina la estabilidad de la comunicación:
private let gestorConexiones = GestorConexion(manejadorSolicitudes: ManejadorSolicitudesDaemon(),
manejadoresConexiones: [GestorConexionesIPC()])
Mecanismos de Seguridad
Las medidas de seguridad incluyen verificación de conexiones, cifrado de datos en tránsito y control de permisos estricto para cada solicitud.
Ejemplo de Flujo de Comunicación
Durante la instalación de una aplicación, el flujo típico es:
- El usuario selecciona una app en AltStore.
- Se envía una solicitud
SolicitudPrepararAppa AltServer. - AltServer procesa los datos y reporta el progreso.
- Finaliza con una solicitud
SolicitudIniciarInstalacion.