Erstellen einer watchOS App
Kopiere einen Setup-Prompt mit den Installationsschritten und dem vollständigen Markdown-Guide für dieses Plugin.
In diesem Guide lernst du, wie du eine watchOS Companion-App von Grund auf erstellst – inklusive Projekt-Setup in Xcode, Integration des CapgoWatchSDK und dem Erstellen einer funktionalen Watch-App mit SwiftUI.
Für Wear OS nutze Erstellen einer Wear OS-App stattdessen.
Voraussetzungen
Abschnitt: „Voraussetzungen“Before you begin, ensure you have:
- Xcode 15 oder neuer (Download im Mac App Store)
- macOS Sonoma oder neuer (für das neueste watchOS SDK)
- Ein bestehendes Capacitor iOS-Projekt (ausführen,
npx cap add iosfalls noch nicht geschehen) - Apple Developer Account (kostenloser Account reicht für Entwicklung)
Projektstruktur-Übersicht
Abschnitt mit dem Titel „Projektstruktur-Übersicht“Nach diesem Guide hat dein Projekt diese Struktur:
Verzeichnisios/
VerzeichnisApp/
VerzeichnisApp/ (deine Haupt-iOS-App)
- …
- App.xcodeproj
- App.xcworkspace (nutze dies zum Öffnen des Projekts)
- Podfile
VerzeichnisMyWatch/ (neue Watch-App)
VerzeichnisMyWatch/ (Watch-App Quellcode)
- MyWatchApp.swift
- ContentView.swift
VerzeichnisAssets.xcassets/
- …
- MyWatch.xcodeproj
Schritt 1: Öffne dein iOS-Projekt in Xcode
Abschnitt mit dem Titel „Schritt 1: Öffne dein iOS-Projekt in Xcode“- Navigiere zu deinem Capacitor Projekt
ios/AppOrdner - Öffne
App.xcworkspace(nicht.xcodeproj) durch Doppelklick - Warten, bis Xcode das Projekt indiziert
Schritt 2: watchOS Target hinzufügen
Abschnitt mit dem Titel „Schritt 2: watchOS Target hinzufügen“-
Gehe in Xcode zu Datei → Neu → Ziel…
-
Wähle im Template-Menü:
- Wähle watchOS Tab oben aus
- Wähle App
- Klicke auf Weiter
-
Konfiguriere deine Watch-App:
- Produktname:
MyWatch(oder dein bevorzugter Name) - Team: Wähle dein Apple Developer Team aus
- Organization Identifier: Muss mit deiner iOS-App übereinstimmen (z. B.
app.capgo) - Bundle-Identifier: Wird automatisch generiert (z. B.
app.capgo.myapp.watchkitapp) - Sprache: Swift
- Benutzeroberfläche: SwiftUI
- Watch App Typ: App (nicht für bestehende iOS-Apps)
- Deaktivieren Notification Scene einschließen (außer du benötigst sie)
- Deaktivieren Complication einschließen (außer du benötigst sie)
- Produktname:
-
Klicken Fertigstellen
-
Wenn „‘MyWatch‘-Schema aktivieren?“ erscheint, klicke auf Aktivieren
Schritt 3: Watch-App-Einstellungen konfigurieren
Abschnitt: „Schritt 3: Watch App Einstellungen konfigurieren“-
Wähle dein Projekt im Project Navigator (linke Seitenleiste) aus (das blaue Icon oben)
-
Wähle dein Watch-Target (z. B. „MyWatch“) aus der Targets-Liste aus
-
Gehe zum Tab General :
- Anzeigename: Der Name unter dem App-Icon (z. B. „Meine App“)
- Bundle-Identifier: Muss enden mit
.watchkitapp - Version: Muss mit deiner iOS-App-Version übereinstimmen
- Build: Passe deine iOS-Buildnummer an
-
Gehe zu Signing & Capabilities Tab:
- Aktivieren Signing automatisch verwalten
- Wähle dein Team
- Xcode erstellt Provisioning Profiles automatisch
-
Setzen Sie Deployment-Infos:
- Mindestversionen: watchOS 9.0 oder neuer
Schritt 4: CapgoWatchSDK via Swift Package Manager hinzufügen
Abschnitt mit dem Titel „Schritt 4: CapgoWatchSDK via Swift Package Manager hinzufügen“Das CapgoWatchSDK bietet eine einsatzbereite WatchConnector Klasse für die Kommunikation.
-
Gehe in Xcode zu Ablage → Paketabhängigkeiten hinzufügen…
-
Gib im Suchfeld Folgendes ein:
https://github.com/Cap-go/capacitor-watch.git -
Drücke Enter und warte, bis Xcode das Package lädt
-
Konfiguriere das Package:
- Dependency-Regel: „Bis zur nächsten Major-Version“ mit „8.0.0“
- Klicken Package hinzufügen
-
Wähle aus, welche Produkte hinzugefügt werden sollen:
- WICHTIG: Wähle nur
CapgoWatchSDK - Stelle sicher, dass es zu deinem Watch-Ziel festlegen (z. B. „MyWatch“), nicht die iOS-App
- Klicken Package hinzufügen
- WICHTIG: Wähle nur
Schritt 5: Die Watch-App implementieren
Abschnitt mit dem Titel „Schritt 5: Die Watch-App implementieren“Erstellen wir nun die Watch-App code. Ersetze die automatisch generierten Dateien durch folgende:
5.1 Den App-Einstiegspunkt erstellen
Abschnitt mit dem Titel „5.1 Den App-Einstiegspunkt erstellen“Bearbeiten 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 Die Hauptansicht erstellen
Abschnitt mit dem Titel „5.2 Die Hauptansicht erstellen“Bearbeiten 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()}Schritt 6: iOS-App für WatchConnectivity konfigurieren
Abschnitt mit dem Titel „Schritt 6: iOS-App für WatchConnectivity konfigurieren“Deine iOS-App benötigt zudem die WatchConnectivity-Capability.
-
Wähle dein Projekt im Project Navigator aus
-
Wähle dein iOS App Target (nicht das Watch-Target)
-
Gehe zu Signing & Capabilities Tab
-
Klicke auf + Capability
-
Suche nach und füge hinzu: WatchConnectivity (falls verfügbar) oder es wird automatisch hinzugefügt
-
Das Capacitor Plugin übernimmt die iOS-Seite automatisch, stelle aber sicher, dass deine Info.plist Folgendes enthält:
<key>WKCompanionAppBundleIdentifier</key><string>app.capgo.myapp.watchkitapp</string>
Schritt 7: Build und Run
Abschnitt mit dem Titel „Schritt 7: Build und Run“Im Simulator ausführen
Abschnitt „Auf dem Simulator ausführen“-
Wähle dein Watch-Scheme im Scheme-Selector (oben im Xcode-Fenster) aus
-
Wähle einen Watch-Simulator aus:
- Klicke auf den Device-Selector neben dem Scheme
- Wähle einen Apple Watch Simulator (z. B. „Apple Watch Series 9 (45mm)“)
-
Klicke auf den Ausführen Button (▶️) oder drücke
Cmd + R -
Der iOS Simulator startet mit iPhone und Apple Watch
Auf einem echten Gerät ausführen
Abschnitt „Auf einem echten Gerät ausführen“-
Verbinde dein iPhone per USB
-
Stelle sicher, dass deine Apple Watch mit diesem iPhone gekoppelt ist
-
Wähle dein Watch-Scheme aus
-
Wähle deine physische Apple Watch aus der Geräteliste aus
-
Klicken Ausführen
-
Beim ersten Mal: Eventuell musst du deinem Computer auf beiden Geräten vertrauen
Schritt 8: Kommunikation testen
Abschnitt: „Schritt 8: Kommunikation testen“Vom iPhone (Capacitor) zur Watch
Abschnitt: „Vom iPhone (Capacitor) zur Watch“In deiner Capacitor-App:
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!' } });}Von der Watch zum iPhone
Abschnitt: „Von der Watch zum iPhone“Die Watch-App nutzt 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)")}Nachrichten auf dem iPhone verarbeiten
Abschnitt: „Nachrichten auf dem iPhone verarbeiten“// 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'] } });});Erweitert: Custom Delegate für mehr Kontrolle
Abschnitt mit dem Titel „Erweitert: Custom Delegate für mehr Kontrolle“Wenn du mehr Kontrolle benötigst, implementiere 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()Fehlerbehebung
Abschnitt mit dem Titel „Troubleshooting“Watch App wird auf der Watch nicht angezeigt
Abschnitt „Watch-App wird nicht auf der Watch angezeigt“- Stelle sicher, dass die Bundle IDs korrekt verknüpft sind (die Bundle ID der Watch-App muss die iOS-App Bundle ID +
.watchkitapp) - Prüfe, ob beide Apps mit demselben Team signiert sind
- Auf einem physischen Gerät: Watch App auf dem iPhone öffnen → Meine Watch → scrolle zu deiner App → auf AN stellen
Nachrichten werden nicht empfangen
Abschnitt: „Nachrichten werden nicht empfangen“- Prüfen, ob WCSession in beiden Apps aktiviert ist
- Prüfen
isReachablevor dem Senden von Nachrichten - Für garantierte Zustellung verwenden Sie
transferUserInfoanstattsendMessage - Sicherstellen, dass Listener registriert sind, bevor das andere Gerät Nachrichten sendet
Fehler „Session Not Activated“
Abschnitt: „Fehler „Session Not Activated““- Rufe
WatchConnector.shared.activate()früh im App-Lifecycle - Unter iOS wird das Plugin automatisch aktiviert – stelle sicher, dass das Plugin importiert wurde
- Prüfen, ob die WatchConnectivity-Capability zum iOS-Target hinzugefügt wurde
Build-Fehler mit CapgoWatchSDK
Abschnitt mit dem Titel „Build-Fehler mit CapgoWatchSDK“- Stelle sicher, dass das Package zum Watch-Targethinzugefügt wurde, nicht zum iOS-Target
- Build-Ordner bereinigen: Produkt → Clean Build Folder (Cmd + Shift + K)
- Package-Caches zurücksetzen: Datei → Packages → Package Caches zurücksetzen
Simulator-Probleme
Abschnitt: „Simulator-Probleme“- Setze die Simulatoren zurück: Einstellungen → Alle Inhalte & Einstellungen löschen
- Stelle sicher, dass iOS- und watchOS-Simulatoren kompatibel sind
- Beide Simulatoren müssen laufen, damit die Kommunikation funktioniert
Nächste Schritte
Abschnitt „Nächste Schritte“- Erstellen einer Wear OS-App für Android-Watches
- API Referenz - Schließe die API Dokumentation ab
- Kommunikationsmuster - Wann du welche Methode nutzt
- Beispiel-App - Vollständiges, funktionierendes Beispiel
Weiterlesen: Erstellen einer watchOS App
Abschnitt mit dem Titel „Weiterlesen: Erstellen einer watchOS App“Wenn du es nutzt Erstellen einer watchOS App Um die Arbeit an nativen Plugins zu planen, verbinde sie mit Verwendung von @capgo/capacitor-watch für die native Funktion in „Verwendung von @capgo/capacitor-watch“, Capgo Plugin-Verzeichnis für den Produkt-Workflow im Capgo Plugin-Verzeichnis, Capacitor Plugins von Capgo für das Implementierungsdetail in Capacitor Plugins von Capgo, Plugins hinzufügen oder aktualisieren für das Implementierungsdetail beim Hinzufügen oder Aktualisieren von Plugins, und Ionic Enterprise Plugin-Alternativen für den Produkt-Workflow bei den Ionic Enterprise Plugin-Alternativen.