Actualice el estado de la interfaz de usuario de sus aplicaciones de Android e iOS en tiempo de ejecución. Motivación Actualizar el estado de la interfaz de usuario en tiempo de ejecución es una herramienta muy útil para fines de validación y creación rápida de prototipos. También agrega el beneficio de que puede ser utilizado por todo el equipo de pruebas, ya sean desarrolladores, diseñadores, control de calidad, etc. demo.mov ¿Cómo funciona? Android Android Debug Bridge (ABD) se utiliza para enviar una señal de transmisión al aplicación deseada con una carga útil json como extra. adb shell estoy transmitiendo -p [package] -a [action] -mi [extra key] [extra value]

En el lado de la aplicación hay un BroadcastReceiver que escucha estas cargas útiles. Tras una deserialización exitosa, se emitirá un nuevo estado y, en consecuencia, se activará una actualización de la interfaz de usuario. Disponibilidad: todos los simuladores y/o dispositivos físicos (incluso con depuración wifi) conectados. iOS Las herramientas de desarrollo Xcode de Apple proporcionan una herramienta de línea de comandos para interactuar con el simulador de iOS. Esta herramienta le permite simular el proceso de envío de notificaciones automáticas a un dispositivo: xcrun simctl push [UDID] [bundle id] [path to .apns]

En el lado de la aplicación hay un NotificationBroadcaster que monitorea activamente las notificaciones entrantes. Luego, estas notificaciones se transmiten a los observadores internos dentro de la aplicación. Tras una deserialización exitosa, se emitirá un nuevo estado y, en consecuencia, se activará una actualización de la interfaz de usuario. Disponibilidad: todos los simuladores arrancados. Instalación Android Agregue la dependencia de la biblioteca: implementación(«com.github.guilhe:json-broadcast-handler:${LATEST_VERSION}'») Administrador de paquetes Swift Las implementaciones de Swift están disponibles a través del Administrador de paquetes Swift. En Xcode, vaya a Archivo > Agregar paquetes… y proporcione la URL https://github.com/GuilhE/JsonBroadcaster.git; Utilice el hash de confirmación de la última etiqueta JsonBroadcasterHandler-x. CocoaPods Si usa CocoaPods, agregue lo siguiente a su Podfile: pod ‘JsonBroadcasterHandler’, :git => ‘https://github.com/GuilhE/JsonBroadcaster.git’, :tag => ‘JsonBroadcasterHandler-x’ Uso: desarrolladores Android Sus clases UiState deben estar anotadas con kotlinx.serialization.Serializable (dependencia): @Serializable data class UiState(val memberA: String, val memberB: String) Cree una implementación BroadcastUiModelHost para escuchar las actualizaciones de estado, como se muestra a continuación: host val privado = objeto: BroadcastUiModelHost(coroutineScope, UiState.serializer()) { override fun updateState(new: UiState) { //… } } Agréguelo donde mejor se adapte a su proyecto, ejemplos: si está utilizando androidx.lifecycle.ViewModel, puede hacerlo lo siguiente: clase MatchViewModel : ViewModel() { valor privado _uiState = MutableStateFlow(MatchUiState(home = Team(«PRT», «?????????»), away = Team(«BRA», «??? ?????»))) val uiState: StateFlow = _uiState host val privado = objeto: BroadcastUiModelHost(viewModelScope, MatchUiState.serializer()) { override fun updateState(new: MatchUiState) { _uiState.update { new } } } } Pero en realidad no necesitas un ViewModel, simplemente puedes usar un @Composable, por ejemplo: @Composable divertido MatchScreen() { var uiState: MatchUiState por recordar { mutableStateOf(MatchUiState(casa = Equipo(«PRT», «?????????»), lejos = Equipo(«BRA», «????? ???»))) } LaunchedEffect(Unidad) { val host = objeto: BroadcastUiModelHost(this, MatchUiState.serializer()) { override fun updateState(new: MatchUiState) { uiState = new } } } Match(uiState) } Y lo bueno de esto es que puedes elegir lo que más te convenga: ViewModel, @Composable, Actividad, Fragmento, etc. Para deshabilitarlo, por ejemplo en compilaciones de lanzamiento, anule la declaración del receptor en AndroidManifest agregando una propiedad manifestPlaceholders en build.gradle: android { buildTypes { getByName(«release») { manifestPlaceholders[«enableJsonBroadcastReceiver»] = falso } getByName(«depurar») { manifestPlaceholders[«enableJsonBroadcastReceiver»] = verdadero } } }



iOS Sus clases UiState deben implementar el protocolo Codable: struct UiState: Codable { let memberA: String let memberB: String } Cree una instancia BroadcastUIModelHost dentro de una clase para escuchar las actualizaciones de estado, como se muestra a continuación: var privada uiModelHost: BroadcastUIModelHost! init() { uiModelHost = BroadcastUIModelHost(initState) { [weak self] newState en //… } } Agréguelo donde mejor se ajuste a su proyecto, ejemplo: Si está utilizando un ObservableObject, puede hacer lo siguiente: import SwiftUI import JsonBroadcasterHandler class MatchViewModel: ObservableObject { private var uiModelHost: BroadcastUIModelHost! @Estado var publicado: MatchUiState = MatchUiState(local: Equipo(país:»PRT», bandera:»?????????»), visitante: Equipo(país:»BRA», bandera:»???? ????»)) init() { uiModelHost = BroadcastUIModelHost(estado) { [weak self] newState in self?.state = newState } } } Y lo bueno de esto es que puedes elegir lo que más te convenga, SwiftUI o UIKit: struct MatchScreen: View { @StateObject private var viewModel = MatchViewModel() var body: some View { ZStack { } .onReceive(viewModel.$state) { nuevo en //… } } clase MatchScreen: UIViewController { var privada viewModel: MatchViewModel! cancelables var privados = Establecer() anular la función viewDidLoad() { super.viewDidLoad() viewModel = MatchViewModel() viewModel.$state .receive(on: DispatchQueue.main) .sink { [weak self] state in self?.updateUI(with: state) } .store(in: &cancellables) } función privada updateUI(with state: MatchUiState) { //… } } Dentro de su AppDelegate regístrese para RemoteNotifications y reenvíelos con NotificationBroadcaster: importar UIKit importar JsonBroadcasterHandler clase AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { func aplicación(_ aplicación: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().delegate = self application.registerForRemoteNotifications() devuelve verdadero } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notificación: UNNotification, withCompletionHandler completeHandler: @escaping (UNNotificationPresentationOptions) -> Void) { NotificationBroadcaster .broadcast(notification) } } consejo: puede crear indicadores personalizados del compilador, DEBUG_MODE, para encapsular NotificationBroadcaster: func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notificación: UNNotification, withCompletionHandler completeHandler: @escaping (UNNotificationPresentationOptions) -> Void) { #if DEBUG_MODE NotificationBroadcaster.broadcast(notificación) #endif } Uso: equipo de pruebas Android El SDK de Android de Google debe estar instalado para poder utilizar herramientas de línea de comandos; Solicite una versión instalada de la aplicación (depuración wifi o cable conectado); Utilice la GUI de la aplicación de escritorio. Se debe instalar XCode de iOS Apple para poder utilizar herramientas de línea de comandos; Abra XCode y ejecute un simulador con la aplicación; Utilice la GUI de la aplicación de escritorio. Aplicación de escritorio Aunque podemos usar la terminal para enviar comandos, no es práctico. La aplicación de escritorio proporciona una interfaz de usuario sencilla para ayudarnos con esa tarea. Para ejecutarlo, puede: Clonar este proyecto y escribir ./gradlew :desktopApp:run en la terminal. Descargue un .dmg (solo MacOS) e instálelo. Consiguelo aqui. nota: por razones de seguridad, dado que esta aplicación no es de un Desarrollador Identificado, MacOS bloqueará su ejecución. Para evitarlo, deberá hacer clic en «Abrir de todos modos» en Configuración del sistema en Seguridad. Solo es necesario una vez: (Esto no sucederá con el primer enfoque) Patios de juegos Utilice la siguiente carga útil para comenzar: { «home»:{ «country»:»PRT», «flag»:»??????? ?» }, «lejos»:{ «país»:»BRA», «bandera»:»????????? }, «homeGoals»:0, «awayGoals»:0, «started»: false, «running»: false, «finished»: false } Android Dentro del módulo de muestra encontrarás una aplicación de juegos lista para que la pruebes . Para ejecutarlo, puede: Clonar este proyecto y escribir ./gradlew :androidApp:installDebug en la terminal. Descargue el .apk de muestra e instálelo. Consiguelo aqui. El ID de aplicación es com.jsonbroadcaster.matchday iOS. Dentro de la carpeta sample-ios encontrará una aplicación de juegos lista para que la pruebe. Para ejecutarlo: ábralo en Xcode y ejecute la configuración estándar. Importe JsonBroadcaster utilizando el método que prefiera. LICENCIA Copyright (c) 2022-presente GuilhE Licenciado bajo la Licencia Apache, Versión 2.0 (la «Licencia»); no puede utilizar este archivo excepto de conformidad con la Licencia. Puede obtener una copia de la Licencia en http://www.apache.org/licenses/LICENSE-2.0 A menos que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulte la Licencia para conocer el idioma específico que rige los permisos y limitaciones de la Licencia.

Source link