Creazione di un'app watchOS
Copia un prompt di configurazione con i passaggi di installazione e la guida markdown completa per questo plugin.
Questa guida ti mostra come creare una watchOS companion app da zero, incluso il setup del progetto in Xcode, l'integrazione di CapgoWatchSDK e la creazione di un'app watch funzionante con SwiftUI.
Per Wear OS, usa Creazione di un'app Wear OS invece.
Prerequisiti
Sezione intitolata “Prerequisiti”Prima di iniziare, assicurati di avere:
- Xcode 15 o versioni successive (scarica dal Mac App Store)
- macOS Sonoma o versioni successive (per l'ultima versione di watchOS SDK)
- Un progetto iOS Capacitor esistente (esegui
npx cap add iosse non l'hai fatto) - Account Apple Developer (l'account gratuito va bene per lo sviluppo)
Panoramica della struttura del progetto
Sezione intitolata “Panoramica della struttura del progetto”Dopo aver completato questa guida, il tuo progetto avrà questa struttura:
Directoryios/
DirectoryApp/
DirectoryApp/ (la tua app iOS principale)
- …
- App.xcodeproj
- App.xcworkspace (usa questo per aprire il progetto)
- Podfile
DirectoryMyWatch/ (nuova watch app)
DirectoryMyWatch/ (codice sorgente watch app)
- MyWatchApp.swift
- ContentView.swift
DirectoryAssets.xcassets/
- …
- MyWatch.xcodeproj
Passaggio 1: Apri il progetto iOS in Xcode
Sezione intitolata “Passaggio 1: Apri il progetto iOS in Xcode”- Vai alla cartella del tuo progetto Capacitor
ios/Appcartella - Apri
App.xcworkspace(non.xcodeproj) facendoci doppio clic - Attendi che Xcode indicizzi il progetto
Passaggio 2: Aggiungi un target watchOS
Sezione intitolata “Passaggio 2: Aggiungi un target watchOS”-
In Xcode, vai su File → Nuovo → Target…
-
Nel selettore dei template:
- Seleziona watchOS scheda in alto
- Usa App
- Clicca su Avanti
-
Configura la tua watch app:
- Nome prodotto:
MyWatch(o il nome che preferisci) - Team: Seleziona il tuo team Apple Developer
- Identificativo organizzazione: Deve corrispondere alla tua app iOS (es.
app.capgo) - Bundle Identifier: Sarà generato automaticamente (es.
app.capgo.myapp.watchkitapp) - Lingua: Swift
- Interfaccia utente: SwiftUI
- Tipo di Watch App: App (non App per un'app iOS esistente)
- Deseleziona Includi Notification Scene (a meno che non ti serva)
- Deseleziona Includi Complication (a meno che non ti serva)
- Nome prodotto:
-
Clicca su Fine
-
Quando appare il prompt “Activate ‘MyWatch’ scheme?”, clicca Attiva
Passaggio 3: Configura le impostazioni della Watch App
Sezione intitolata “Passaggio 3: Configura le impostazioni dell'app Watch”-
Nel Project Navigator (barra laterale sinistra), seleziona il tuo progetto (l'icona blu in alto)
-
Seleziona il target watch (es. “MyWatch”) dall'elenco dei target
-
Vai a Generali scheda:
- Nome visualizzato: Il nome visualizzato sotto l'icona dell'app (es. “My App”)
- Bundle Identifier: Deve terminare con
.watchkitapp - Versione: Deve corrispondere alla versione della tua app iOS
- Build: Allinea il build number della tua app iOS
-
Vai su Firma e Capabilities scheda:
- Abilita Gestisci automaticamente la firma
- Seleziona la tua Team
- Xcode creerà i provisioning profile automaticamente
-
Imposta Info di Deployment:
- Deployment minimi: watchOS 9.0 o versioni successive
Passaggio 4: Aggiungi CapgoWatchSDK tramite Swift Package Manager
Sezione intitolata “Passaggio 4: Aggiungi CapgoWatchSDK tramite Swift Package Manager”Il CapgoWatchSDK fornisce una WatchConnector classe pronta all'uso per la comunicazione.
-
In Xcode, vai su File → Aggiungi dipendenze pacchetto…
-
Nel campo di ricerca, inserisci:
https://github.com/Cap-go/capacitor-watch.git -
Premi Invio e attendi che Xcode scarichi il package
-
Configura il package:
- Regola delle dipendenze: “Fino alla prossima versione major” con “8.0.0”
- Clicca su Aggiungi pacchetto
-
Scegli quali prodotti aggiungere:
- IMPORTANTE: Seleziona solo
CapgoWatchSDK - Assicurati che sia aggiunto al tuo target watch (es. “MyWatch”), non all'app iOS
- Clicca su Aggiungi pacchetto
- IMPORTANTE: Seleziona solo
Passaggio 5: Implementa l'app Watch
Sezione intitolata “Passaggio 5: Implementa l'app Watch”Ora creiamo l'app watch code. Sostituisci i file generati automaticamente con i seguenti:
5.1 Crea il punto di ingresso dell'app
Sezione intitolata “5.1 Crea il punto di ingresso dell'app”Modifica 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 principale
Sezione intitolata “5.2 Crea la vista principale”Modifica 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()}Passaggio 6: Configura l'app iOS per WatchConnectivity
Sezione intitolata “Passaggio 6: Configura l'app iOS per WatchConnectivity”Anche la tua app iOS necessita della capability WatchConnectivity.
-
Nel Project Navigator, seleziona il tuo progetto
-
Seleziona la tua Target dell'app iOS (non il target dell'watch)
-
Vai su Firma e Capabilities scheda
-
Clicca su + Funzionalità
-
Cerca e aggiungi WatchConnectivity (se disponibile) o potrebbe essere aggiunto automaticamente
-
Il plugin Capacitor gestisce automaticamente la parte iOS, ma assicurati che il tuo Info.plist contenga:
<key>WKCompanionAppBundleIdentifier</key><string>app.capgo.myapp.watchkitapp</string>
Passaggio 7: Build ed esegui
Sezione intitolata “Step 7: Build and Run”Esegui sul Simulatore
Sezione: “Run on Simulator”-
Seleziona lo scheme per l'watch dal selettore degli schemi (in alto nella finestra di Xcode)
-
Scegli un simulatore Apple Watch:
- Clicca sul selettore del dispositivo accanto allo scheme
- Seleziona un simulatore Apple Watch (es. “Apple Watch Series 9 (45mm)”)
-
Clicca sul Esegui il tasto (▶️) o premi
Cmd + R -
L'iOS Simulator si avvierà con iPhone e Apple Watch
Esegui su dispositivo fisico
Sezione: “Run on Physical Device”-
Connetti il tuo iPhone via USB
-
Assicurati che l'Apple Watch sia associato a quell'iPhone
-
Seleziona lo scheme dell'app watch
-
Seleziona il tuo Apple Watch fisico dalla lista dei dispositivi
-
Clicca su Esegui
-
Prima volta: potresti dover autorizzare il computer su entrambi i dispositivi
Passaggio 8: Testa la comunicazione
Sezione intitolata “Passaggio 8: Test della comunicazione”Dall'iPhone (Capacitor) al Watch
Sezione intitolata “Da iPhone (Capacitor) all'Apple Watch”Nella tua app 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!' } });}Dal Watch all'iPhone
Sezione intitolata “Dall'Apple Watch all'iPhone”L'app per watch utilizza 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)")}Gestire i messaggi su iPhone
Sezione intitolata “Gestire i messaggi su 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'] } });});Avanzato: Delegate personalizzato per un controllo maggiore
Sezione intitolata “Avanzato: Delegate personalizzato per un controllo maggiore”Se hai bisogno di maggiore controllo, implementa 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()Risoluzione problemi
Sezione intitolata “Troubleshooting”L'app Watch non appare sull'Apple Watch
Sezione intitolata “L'app Watch non appare sull'Apple Watch”- Assicurati che i bundle ID siano correlati correttamente (il bundle ID dell'app Watch deve essere il bundle ID dell'app iOS +
.watchkitapp) - Verifica che entrambe le app siano firmate con lo stesso team
- Su dispositivo fisico: Apri l'app Watch su iPhone → Mio Watch → scorri per trovare la tua app → attiva l'interruttore
I messaggi non vengono ricevuti
Sezione: “Messaggi non ricevuti”- Verifica che entrambe le app abbiano WCSession attivata
- Verifica
isReachableprima di inviare i messaggi - Per una consegna garantita, usa
transferUserInfoinvece disendMessage - Assicurati che i listener siano registrati prima che l'altro dispositivo invii messaggi
Errore “Session Not Activated”
Sezione: “Errore: Session Not Activated”- Chiama
WatchConnector.shared.activate()nelle fasi iniziali del ciclo di vita dell'app - Su iOS, il plugin si attiva automaticamente: assicurati che sia importato
- Verifica che la capability WatchConnectivity sia stata aggiunta al target iOS
Errori di build con CapgoWatchSDK
Sezione: “Errori di build con CapgoWatchSDK”- Assicurati che il pacchetto sia stato aggiunto al target watch, non al target iOS
- Pulisci la cartella di build: Prodotto → Pulisci cartella build (Cmd + Shift + K)
- Reset della cache dei pacchetti: File → Packages → Reset Package Caches
Problemi con il simulatore
Sezione: “Problemi con il Simulatore”- Resetta i simulatori: Impostazioni → Inizializza contenuto e impostazioni
- Assicurati che i simulatori iOS e watchOS siano versioni compatibili
- Entrambi i simulatori devono essere attivi per consentire la comunicazione
Prossimi passi
Sezione intitolata “Prossimi passi”- Creazione di un'app Wear OS per gli smartwatch Android
- Riferimento API - Completa la documentazione API
- Pattern di Comunicazione - Quando usare ogni metodo
- App di esempio - Esempio completo funzionante
Continua da Creazione di un'app watchOS
Sezione intitolata “Continua da Creazione di un'app watchOS”Se stai usando Creazione di un'app watchOS per pianificare il lavoro sui plugin nativi, collegalo a Utilizzo di @capgo/capacitor-watch per la funzionalità nativa in Utilizzo di @capgo/capacitor-watch, Directory dei plugin di Capgo per il workflow del prodotto nella Capgo Plugin Directory, Plugin Capacitor di Capgo per i dettagli di implementazione in Capacitor Plugins di Capgo, Aggiunta o aggiornamento dei plugin per i dettagli su come aggiungere o aggiornare i plugin, e Alternative ai plugin Ionic Enterprise per il workflow del prodotto in Alternative ai plugin Ionic Enterprise.