Saltare al contenuto

Creare un'applicazione watchOS

Questa guida ti guida attraverso la creazione di un'app di accompagnamento watchOS da zero, inclusa la configurazione del progetto in Xcode, l'integrazione del CapgoWatchSDK e la creazione di un'app watch funzionale con SwiftUI.

Prima di iniziare, assicurati di avere:

  • Xcode 15 o successivo (scarica dal Mac App Store)
  • macOS Sonoma o successivo (per il watchOS SDK)
  • Un progetto iOS esistente Capacitor (esegui npx cap add ios se non hai ancora fatto così)
  • account Apple Developer (un account gratuito funziona per lo sviluppo)

Dopo aver completato questa guida, il tuo progetto avrà questa struttura:

  • Directoryios/
    • DirectoryApp/
      • DirectoryApp/ App iOS principale
      • App.xcodeproj
      • App.xcworkspace Usa questo per aprire il progetto
      • Podfile
    • DirectoryMyWatch/ Directory
      • MyWatch/Sorgente dell'app per orologio MyWatchApp.swift
        • Directory
        • ContentView.swift
        • DirectoryAssets.xcassets/
      • MyWatch.xcodeproj
  1. Naviga al tuo progetto Capacitor ios/App cartella
  2. Apri App.xcworkspace non .xcodeprojda
  3. Attendere che Xcode indichi il progetto
  1. In Xcode, vai a File → Nuovo → Target…

  2. In il scegli il modello:

    • Scegli watchOS scheda in alto
    • Scegli Applicazione
    • Clicca Avanti
  3. Configura la tua app per orologio:

    • Nome del prodotto: MyWatch (o il tuo nome preferito)
    • Team: Seleziona il tuo team di sviluppatore Apple
    • Identificatore dell'organizzazione: Deve corrispondere alla tua app iOS (ad esempio, app.capgo)
    • Identificatore della Bundle: Sarà generato automaticamente (ad esempio, app.capgo.myapp.watchkitapp)
    • Lingua: Swift
    • Interfaccia Utente: SwiftUI
    • Tipo di App Watch: App (non App per App iOS Esistente)
    • Disattiva Includi Scena di Notifica (a meno che non ne abbia bisogno)
    • Disattiva Includi Complicazione (a meno che tu non ne abbia bisogno)
  4. Clicca Completa

  5. Quando verrai sollecitato “Attiva lo schema ‘MyWatch’?”, clicca Attiva

Passo 3: Configura Impostazioni dell'App per l'Orologio

Sezione intitolata “Passo 3: Configura Impostazioni dell'App per l'Orologio”
  1. Nel Navigatore del Progetto (barra laterale sinistra), seleziona il tuo progetto (l'icona blu in alto)

  2. Seleziona il tuo target per l'orologio (ad esempio, “MyWatch”) dalla lista dei target

  3. Vai al Generale tab:

    • Nome a schermo: Il nome mostrato sotto l'icona dell'app (ad esempio, "Mia App")
    • Identificatore del Bundle: Dovrebbe finire con .watchkitapp
    • Versione: Corrisponde alla versione del tuo app iOS
    • Build: Corrisponde al numero di costruzione del tuo app iOS
  4. Vai a Firma e Capacità tab:

    • Abilita Gestisci automaticamente la firma
    • Seleziona il tuo Team
    • Xcode creerà i profili di provisioning automaticamente
  5. Imposta Informazioni di distribuzione:

    • Minimi Deployments: watchOS 9.0 o successivo

Passo 4: Aggiungi CapgoWatchSDK tramite Swift Package Manager

Sezione intitolata “Passo 4: Aggiungi CapgoWatchSDK tramite Swift Package Manager”

Il CapgoWatchSDK fornisce un ready-to-use WatchConnector classe per la comunicazione.

  1. In Xcode, vai a File → Aggiungi Dipendenze del Pacchetto…

  2. In campo di ricerca, inserisci:

    https://github.com/Cap-go/capacitor-watch.git
  3. Tieni premuto Invio e attendi che Xcode recuperi il pacchetto

  4. Configura il pacchetto:

    • Regola di Dipendenza: “Fino alla prossima versione maggiore” con “8.0.0”
    • Clicca Aggiungi Pacchetto
  5. Scegli quali prodotti aggiungere:

    • IMPORTANTE: Seleziona solo CapgoWatchSDK
    • Assicurati che sia aggiunto al tuo guarda il target (ad esempio, “MyWatch”), non l'app iOS
    • Clicca Aggiungi Pacchetto

Crea ora l'app di orologio code. Sostituisci i file generati automaticamente con i seguenti:

Modifica MyWatch/MyWatchApp.swift:

import SwiftUI
import CapgoWatchSDK
@main
struct MyWatchApp: App {
init() {
// Activate WatchConnectivity when app launches
WatchConnector.shared.activate()
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}

Modifica MyWatch/ContentView.swift:

import SwiftUI
import 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 status
struct 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()
}

Passo 6: Configura l'App iOS per WatchConnectivity

Sezione intitolata “Passo 6: Configura l'app iOS per WatchConnectivity”

La tua app iOS ha anche bisogno della capacità di WatchConnectivity.

  1. Nel Navigatore del Progetto, seleziona il tuo progetto

  2. Seleziona il tuo Target dell'app iOS (non il target dell'orologio)

  3. Vai a Tabella delle firme e delle capacità Clicca

  4. Aggiungi capacità Cerca e aggiungi

  5. Search for and add Connessione Watch (se disponibile) oppure potrebbe essere aggiunta automaticamente

  6. Il plugin Capacitor gestisce automaticamente il lato iOS, ma assicurati che il tuo Info.plist abbia:

    <key>WKCompanionAppBundleIdentifier</key>
    <string>app.capgo.myapp.watchkitapp</string>
  1. Seleziona il tuo schema di orologio dalla selezione dei schemi (in alto nella finestra di Xcode)

  2. Scegli un simulatore di orologio:

    • Clicca sul selezionatore del dispositivo accanto al schema
    • Seleziona un simulatore di Apple Watch (ad esempio, “Apple Watch Series 9 (45mm)”)
  3. Clicca il Esegui tasto (▶️) o premi Cmd + R

  4. L'iPhone Simulator si avvierà con entrambi l'iPhone e l'Apple Watch

  1. Collega il tuo iPhone tramite USB

  2. Assicurati che l'Apple Watch sia sincronizzato con quell'iPhone

  3. Seleziona il tuo schema di orologio

  4. Seleziona il tuo Apple Watch fisico dalla lista dei dispositivi

  5. Clicca Esegui

  6. Prima volta: potresti dover fidarti del computer su entrambi i dispositivi

Nella tua app Capacitor:

import { CapgoWatch } from '@capgo/capacitor-watch';
// Check connection
const info = await CapgoWatch.getInfo();
console.log('Watch reachable:', info.isReachable);
// Send a message
if (info.isReachable) {
await CapgoWatch.sendMessage({
data: { action: 'update', value: 'Hello from iPhone!' }
});
}

L'app dell'orologio utilizza WatchConnector:

// Send message (fire and forget)
WatchConnector.shared.sendMessage(["action": "buttonTapped"])
// Send message with reply
WatchConnector.shared.sendMessage(["request": "getData"]) { reply in
print("Got reply: \(reply)")
}
// Listen for messages from watch
await CapgoWatch.addListener('messageReceived', (event) => {
console.log('Message from watch:', event.message);
// { action: 'buttonTapped' }
});
// Handle messages that need a reply
await 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: Delegato personalizzato per un controllo maggiore

Sezione intitolata “Avanzato: Delegato personalizzato per un controllo maggiore”

Se hai bisogno di un controllo maggiore, implementa WatchConnectorDelegate:

import SwiftUI
import 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 = handler
WatchConnector.shared.activate()
  1. Assicurati che gli ID dei pacchetti siano correttamente correlati (l'ID del pacchetto dell'app Watch dovrebbe essere l'ID del pacchetto dell'app iOS + .watchkitapp)
  2. Verifica che entrambe le app siano firmate con lo stesso team
  3. Su dispositivo fisico: Apri l'app Watch sul iPhone → Il mio Watch → scorri per trovare la tua app → attiva ON
  1. Verifica che entrambe le app abbiano WCSession attivato
  2. Controlla isReachable prima di inviare i messaggi
  3. Per una consegna garantita, utilizza transferUserInfo al posto di sendMessage
  4. Assicurarsi che gli ascoltatori siano registrati prima che l'altro dispositivo invii messaggi
  1. Chiamata WatchConnector.shared.activate() all'inizio del ciclo di vita dell'app
  2. Sul iOS, il plugin si attiva automaticamente - assicurarsi che il plugin sia importato
  3. Controllare che la capacità WatchConnectivity sia aggiunta al target iOS
  1. Assicurarsi che il pacchetto sia aggiunto al target dell'orologio, non iOS target
  2. Pulisci cartella di costruzione: Prodotto → Pulisci Cartella di Costruzione (Cmd + Shift + K)
  3. Ripristina cache dei pacchetti: File → Pacchetti → Ripristina Cache dei Pacchetti
  1. Ripristina i simulatori: Dispositivo → Cancella Tutti i Contenuti e le Impostazioni
  2. Assicurati che i simulatori iOS e watchOS siano coppie compatibili
  3. Entrambi i simulatori devono essere in esecuzione per garantire la comunicazione