Crear una aplicación de reloj
Copiar un prompt de configuración con los pasos de instalación y la guía de markdown completa para este plugin.
Esta guía te guía a través de la creación de una aplicación de compañero de reloj watchOS desde cero, incluyendo la configuración del proyecto en Xcode, la integración del CapgoWatchSDK y la creación de una aplicación de reloj funcional con SwiftUI.
Requisitos previos
Sección titulada “Requisitos previos”Antes de comenzar, asegúrate de tener:
- Xcode 15 o posterior (descarga desde la Tienda de Mac)
- macOS Sonoma o posterior (para la última versión de watchOS SDK)
- Un proyecto de iOS existente Capacitor (corre
npx cap add iossi no has hecho) - cuenta de desarrollador de Apple una cuenta gratuita funciona para el desarrollo)
Resumen de la estructura del proyecto
Sección titulada “Resumen de la estructura del proyecto”Después de completar esta guía, tu proyecto tendrá esta estructura:
Carpetaios/
CarpetaApp/
CarpetaApp/ (su aplicación principal de iOS)
- …
- App.xcodeproj
- App.xcworkspace (utilice esto para abrir el proyecto)
- Podfile
DirectorioMyWatch/ (nueva aplicación de reloj)
DirectorioMyWatch/ (fuente de la aplicación de reloj)
- MyWatchApp.swift
- ContentView.swift
DirectorioAssets.xcassets/
- …
- MiReloj.xcodeproj
Paso 1: Abra su proyecto de iOS en Xcode
Título de la sección “Paso 1: Abra su proyecto de iOS en Xcode”- Navegue hasta su proyecto Capacitor
ios/Appcarpeta - Abrir
App.xcworkspace(no.xcodeproj) al hacer doble clic en él - Espere a que Xcode indexe el proyecto
Paso 2: Agregar un objetivo de reloj
Título de la sección “Paso 2: Agregar un objetivo de reloj”-
En Xcode, vaya a Archivo → Nuevo → Objetivo…
-
En el selector de plantillas:
- Seleccione reloj pestaña en la parte superior
- seleccionar Aplicación
- hacer clic Siguiente
-
Configura tu aplicación de reloj:
- Nombre del producto:
MyWatch(o el nombre que prefieras) - EquipoSelecciona tu equipo de desarrolladores de Apple
- Identificador de la organizaciónDebería coincidir con tu aplicación iOS (por ejemplo,
app.capgo) - Identificador de paquete: Se generará automáticamente (por ejemplo,
app.capgo.myapp.watchkitapp) - Lenguajecontext
- : SwiftInterfaz de usuario
- : SwiftUITipo de aplicación de reloj
- : Aplicación (no Aplicación para Aplicación de iOS existente) Deshacer Incluir escena de notificación
- (a menos que lo necesite) Incluir Complicación (a menos que lo necesites)
- Nombre del producto:
-
Hacer clic Terminar
-
Cuando se le pregunte ‘Activar el esquema ‘Mi Reloj’?, haga clic Activar
Paso 3: Configurar ajustes de la aplicación de reloj
Sección titulada ‘Paso 3: Configurar ajustes de la aplicación de reloj’-
En el Navegador de Proyectos (barra lateral izquierda), seleccione su proyecto (el icono azul en la parte superior)
-
Seleccione su objetivo de reloj (por ejemplo, ‘Mi Reloj’) de la lista de objetivos
-
Vaya a la General pestaña:
- Nombre de pantallaNombre de pantalla: El nombre que se muestra debajo del icono de la aplicación (por ejemplo, "Mi aplicación")
- Identificador de paqueteIdentificador de paquete: Debe terminar con
.watchkitapp - VersiónVersión: Coincidir con la versión de la aplicación iOS
- CompilaciónCompilación: Coincidir con el número de compilación de la aplicación iOS
-
Ir a Firma y capacidades pestaña:
- Activar Gestionar automáticamente la firma
- Seleccione su Equipo
- La aplicación Xcode creará perfiles de configuración de forma automática
-
Establecer Información de despliegue:
- Despliegues mínimos: watchOS 9.0 o posterior
Paso 4: Agregue CapgoWatchSDK mediante el Administrador de Paquetes de Swift
Paso 4: Agregue CapgoWatchSDK mediante el Administrador de Paquetes de SwiftEl CapgoWatchSDK proporciona una solución lista para usar WatchConnector clase para la comunicación.
-
En Xcode, ve a Archivo → Agregar dependencias de paquetes…
-
En el campo de búsqueda, escribe:
https://github.com/Cap-go/capacitor-watch.git -
Pulsa Enter y espera a que Xcode obtenga el paquete
-
Configura el paquete:
- Regla de dependencia: “Hasta la próxima versión mayor” con “8.0.0”
- Pulsa Agregar paquete
-
Elige qué productos agregar:
- IMPORTANTE: Solo seleccione
CapgoWatchSDK - Asegúrese de que esté agregado a su (por ejemplo, “MiReloj”), no la aplicación iOS Haga clic
- Agregar Paquete Consejo
- IMPORTANTE: Solo seleccione
Step 5: Implementa la Aplicación de Reloj
Sección titulada “Step 5: Implementa la Aplicación de Reloj”Ahora crearemos la aplicación de reloj code. Reemplaza los archivos generados automáticamente con los siguientes:
5.1 Crea el Punto de Entrada de la Aplicación
Sección titulada “5.1 Crea el Punto de Entrada de la Aplicación”Editar MyWatch/MyWatchApp.swift:
import SwiftUIimport CapgoWatchSDK
@mainstruct MyWatchApp: App { init() { // Activate WatchConnectivity when app launches WatchConnector.shared.activate() }
var body: some Scene { WindowGroup { ContentView() } }}5.2 Crea la Vista Principal
Sección titulada “5.2 Crea la Vista Principal”Editar MyWatch/ContentView.swift:
import SwiftUIimport CapgoWatchSDK
struct ContentView: View { // Observe the WatchConnector for automatic UI updates @ObservedObject var connector = WatchConnector.shared
// Local state @State private var messageText = "" @State private var statusMessage = "Ready"
var body: some View { ScrollView { VStack(spacing: 16) { // Connection Status ConnectionStatusView(connector: connector)
Divider()
// Message Input TextField("Message", text: $messageText) .textFieldStyle(.roundedBorder)
// Send Buttons HStack { Button("Send") { sendMessage() } .disabled(!connector.isReachable || messageText.isEmpty)
Button("Request") { sendWithReply() } .disabled(!connector.isReachable || messageText.isEmpty) }
Divider()
// Status Text(statusMessage) .font(.caption) .foregroundColor(.secondary)
// Last Received Message if !connector.lastMessage.isEmpty { VStack(alignment: .leading) { Text("Last Message:") .font(.caption) .foregroundColor(.secondary) Text(formatMessage(connector.lastMessage)) .font(.caption2) } .frame(maxWidth: .infinity, alignment: .leading) } } .padding() } }
private func sendMessage() { connector.sendMessage(["text": messageText, "timestamp": Date().timeIntervalSince1970]) statusMessage = "Message sent" messageText = "" }
private func sendWithReply() { connector.sendMessage(["text": messageText, "needsReply": true]) { reply in DispatchQueue.main.async { statusMessage = "Reply: \(formatMessage(reply))" } } messageText = "" }
private func formatMessage(_ message: [String: Any]) -> String { message.map { "\($0.key): \($0.value)" }.joined(separator: ", ") }}
// Separate view for connection statusstruct ConnectionStatusView: View { @ObservedObject var connector: WatchConnector
var body: some View { HStack { Circle() .fill(connector.isReachable ? Color.green : Color.red) .frame(width: 12, height: 12)
Text(connector.isReachable ? "Connected" : "Disconnected") .font(.headline)
Spacer()
if connector.isActivated { Image(systemName: "checkmark.circle.fill") .foregroundColor(.green) } } }}
#Preview { ContentView()}Step 6: Configura la Aplicación de iOS para WatchConnectivity
Sección titulada “Paso 6: Configure la aplicación de iOS para WatchConnectivity”También necesita su aplicación de iOS la capacidad de WatchConnectivity.
-
En el Navegador de Proyectos, seleccione su proyecto
-
Seleccione su Objetivo de aplicación de iOS (no el objetivo de la reloj)
-
Vaya a Configuración de firmas y capacidades pantalla
-
Haga clic Agregar capacidad
-
Busque y agregue WatchConnectivity (si está disponible) o puede agregarse automáticamente
-
El plugin Capacitor maneja el lado iOS automáticamente, pero asegúrese de que su archivo Info.plist tenga:
<key>WKCompanionAppBundleIdentifier</key><string>app.capgo.myapp.watchkitapp</string>
Paso 7: Compilar y Ejecutar
Título de la sección “Paso 7: Compilar y Ejecutar”Ejecutar en Simulador
Título de la sección “Ejecutar en Simulador”-
Seleccione su esquema de reloj desde el selector de esquemas (en la parte superior de la ventana de Xcode)
-
Elige un simulador de reloj:
- Haga clic en el selector de dispositivo junto al esquema
- Seleccione un simulador de Apple Watch (por ejemplo, “Apple Watch Series 9 (45mm)”)
-
Haga clic en el Ejecutar botón (▶️) o presione
Cmd + R -
El simulador de iOS se lanzará con ambos iPhone y Apple Watch
Ejecutar en Dispositivo Físico
Sección titulada “Ejecutar en Dispositivo Físico”-
Conecte su iPhone mediante USB
-
Asegúrese de que su Apple Watch esté pairado con ese iPhone
-
Seleccione su esquema de reloj
-
Seleccione su Apple Watch física desde la lista de dispositivos
-
Haga clic Ejecutar
-
Primera vez: Puede necesitar confiar en su computadora en ambos dispositivos
Paso 8: Probar la comunicación
Título del paso: Probar la comunicaciónDesde iPhone (Capacitor) a Reloj
Título del apartado: Desde iPhone (Capacitor) a RelojEn su aplicación Capacitor:
import { CapgoWatch } from '@capgo/capacitor-watch';
// Check connectionconst info = await CapgoWatch.getInfo();console.log('Watch reachable:', info.isReachable);
// Send a messageif (info.isReachable) { await CapgoWatch.sendMessage({ data: { action: 'update', value: 'Hello from iPhone!' } });}De la aplicación de reloj a iPhone
Sección titulada “De la aplicación de reloj a iPhone”La aplicación de reloj utiliza WatchConnector:
// Send message (fire and forget)WatchConnector.shared.sendMessage(["action": "buttonTapped"])
// Send message with replyWatchConnector.shared.sendMessage(["request": "getData"]) { reply in print("Got reply: \(reply)")}Gestionar mensajes en iPhone
Sección titulada “Gestionar mensajes en iPhone”// Listen for messages from watchawait CapgoWatch.addListener('messageReceived', (event) => { console.log('Message from watch:', event.message); // { action: 'buttonTapped' }});
// Handle messages that need a replyawait CapgoWatch.addListener('messageReceivedWithReply', async (event) => { console.log('Request from watch:', event.message);
// Send reply back await CapgoWatch.replyToMessage({ callbackId: event.callbackId, data: { status: 'success', items: ['item1', 'item2'] } });});Avanzado: Delegado personalizado para más control
Sección titulada “Avanzado: Delegado personalizado para más control”Si necesita más control, implemente WatchConnectorDelegate:
import SwiftUIimport CapgoWatchSDK
class WatchHandler: WatchConnectorDelegate { func didReceiveMessage(_ message: [String: Any]) { print("Received: \(message)") // Handle incoming message }
func didReceiveMessageWithReply(_ message: [String: Any], replyHandler: @escaping ([String: Any]) -> Void) { print("Received request: \(message)") // Process and send reply replyHandler(["status": "processed"]) }
func didReceiveApplicationContext(_ context: [String: Any]) { print("Context updated: \(context)") }
func didReceiveUserInfo(_ userInfo: [String: Any]) { print("User info received: \(userInfo)") }
func reachabilityDidChange(_ isReachable: Bool) { print("Reachability changed: \(isReachable)") }
func activationDidComplete(with state: WCSessionActivationState) { print("Activation completed: \(state.rawValue)") }}
// In your app setup:let handler = WatchHandler()WatchConnector.shared.delegate = handlerWatchConnector.shared.activate()Solución de problemas
Sección titulada “Solución de problemas”La aplicación de reloj no aparece en el reloj
Sección titulada “La aplicación de reloj no aparece en el reloj”- Asegúrese de que los identificadores de paquete estén relacionados correctamente (el identificador de paquete de la aplicación de reloj debe ser el identificador de paquete de la aplicación de iOS +)
.watchkitapp) - Verifique que ambas aplicaciones estén firmadas con el mismo equipo
- En dispositivo físico: Abra la aplicación de reloj en el iPhone → Mi reloj → desplácese para encontrar su aplicación → active ON
Los mensajes no se están recibiendo
Sección titulada “Los mensajes no se están recibiendo”- Verifique que ambas aplicaciones tengan WCSession activado
- Verifique
isReachableantes de enviar mensajes - Para una entrega garantizada, utilice
transferUserInfoen lugar desendMessage - Asegúrese de que los oyentes estén registrados antes de que el otro dispositivo envíe mensajes
Error de "Sesión no activada"
Título de la sección "Error de Sesión no activada"- Llamar
WatchConnector.shared.activate()contexto: Llamada a una función de JavaScript en un fragmento de texto de Capgo UI (clave de página `appflow_migration_step2`). Página/área: Comparación y migración de Appflow. Rol: Copia de sitio web. Visto en: página ionic-appflow.astro. Mantener exactamente los términos de producto/marca y de desarrollador de Capgo. - pronto en el ciclo de vida de la aplicación
- En iOS, el plugin se activa automáticamente - asegúrese de que el plugin esté importado
Verificar que la capacidad de WatchConnectivity se haya agregado a la objetivo de iOS
Errores de compilación con CapgoWatchSDK- Título de la sección "Errores de compilación con CapgoWatchSDK" Asegúrese de que el paquete esté agregado a la objetivo de la relojNo objetivo, iOS
- Limpiar carpeta de compilación: Producto → Limpiar Carpeta de Compilación (Cmd + Mayús + K)
- Resetear cachés de paquetes: Archivo → Paquetes → Resetear Cachés de Paquetes
Problemas del simulador
Sección titulada “Problemas del simulador”- Resetear los simuladores: Dispositivo → Borrar Todo y Configuración
- Asegurarse de que los simuladores de iOS y watchOS sean pares compatibles
- Ambos simuladores deben estar ejecutándose para que la comunicación funcione
Pasos siguientes
Sección titulada “Pasos siguientes”- API Reference - Documentación completa de API
- Patrones de comunicación - Cuando utilizar cada método
- App de ejemplo - Ejemplo de aplicación funcional
Sigue adelante desde Crear una aplicación de reloj
Sección titulada “Sigue adelante desde Crear una aplicación de reloj”Si estás utilizando Crear una aplicación de reloj para planificar el trabajo de plugin nativo, conecte con Usando @capgo/capacitor-watch para la capacidad nativa en Usando @capgo/capacitor-watch Directorio de Plugin Capgo para el flujo de trabajo del producto en Directorio de Plugin Capgo Plugins de Capacitor por Capgo para el detalle de implementación en Plugins de Capacitor por Capgo Agregar o Actualizar Plugins para el detalle de implementación en Agregar o Actualizar Plugins, y Alternativas de Plugins de Ionic Enterprise para el flujo de trabajo del producto en Alternativas de Plugins de Ionic Enterprise.