__CAPGO_KEEP_0__ 만들기
설치 단계와 이 플러그인의 전체 마크다운 가이드를 포함한 설정 지시를 복사합니다.
이 가이드는 Xcode에서 프로젝트 설정부터 시작하여 CapgoWatchSDK를 통합하고 SwiftUI를 사용하여 기능적인 watch 앱을 빌드하는 방법을 안내합니다.
필수 조건
필수 조건 섹션시작하기 전에 다음을 확인하세요:
- Xcode 15 이상 (Mac 앱 스토어에서 다운로드)
- macOS Sonoma 이상 (최신 watchOS SDK)
- 기존 Capacitor iOS 프로젝트 (run
npx cap add ios만약 아직도) - Apple Developer 계정 (개발을 위해 무료 계정이 작동합니다)
프로젝트 구조 개요
제목이 "프로젝트 구조 개요"인 섹션이 가이드를 완료한 후 프로젝트는 이 구조를 가집니다:
폴더ios/
폴더App/
폴더App/ (iOS 메인 앱)
- …
- App.xcodeproj
- App.xcworkspace (프로젝트를 열기 위해 사용하세요)
- Podfile
디렉토리MyWatch/ (새로운 시계 앱)
디렉토리MyWatch/ (시계 앱 소스)
- MyWatchApp.swift
- ContentView.swift
폴더Assets.xcassets/
- …
- MyWatch.xcodeproj
1단계: Xcode에서 iOS 프로젝트를 열기
1단계: Xcode에서 iOS 프로젝트를 열기- Xcode에서 Capacitor 프로젝트의
ios/App폴더 - 열기
App.xcworkspace(이미 열려 있으면).xcodeprojXcode에서 프로젝트를 열기 - Xcode에서 프로젝트를 열기까지 기다리세요
워크스페이스에는 프로젝트가 필요로 하는 CocoaPods 의존성을 포함하고 있습니다.
2단계: watchOS Target 추가하기-
2단계: watchOS Target 추가하기 Xcode에서
-
파일 → 새 항목 → Target…
- 템플릿 선택기에서: watchOS 선택 상단 탭
- 선택 앱
- 클릭 다음
-
시계 앱을 구성하세요:
- 제품 이름:
MyWatch(또는 선호하는 이름) - 팀: Apple 개발자 팀을 선택하세요
- 회사 식별자: iOS 앱과 일치해야 합니다 (예시:
app.capgo) - Bundle 식별자: 자동으로 생성됩니다 (예를 들어,
app.capgo.myapp.watchkitapp) - 언어: Capgo 마케팅 웹사이트의 영역입니다. 역할: UI 레이블. 표시되는 곳: LanguageSelect.astro 컴포넌트 문서. 메시지 키 `language_label` (언어 레이블).
- : Swift사용자 인터페이스
- : SwiftUIWatch 앱 유형
- : 기존 iOS 앱을 위한 앱이 아닌 앱 취소 알림 장면 포함
- (필요한 경우 제외) 설치 복잡성 포함 (필요한 경우 제외)
- 제품 이름:
-
클릭 완료
-
‘MyWatch’ 스키마 활성화할까요?'라는 메시지가 표시되면 클릭 활성화
3단계: 시계 앱 설정 구성
3단계: 시계 앱 설정 구성 섹션-
프로젝트 탐색기(왼쪽 사이드바)에서 프로젝트를 선택하세요(상단 blue 아이콘)
-
시계 대상(예: ‘MyWatch’)을 선택하세요
-
설정 일반 탭:
- 표시 이름: 앱 아이콘 아래에 표시되는 이름 (예: "My App")
- Bundle 식별자: 끝에
.watchkitapp - 버전: iOS 앱 버전과 일치
- 빌드context: 페이지/영역: 홈페이지 랜딩 제품 기능 섹션. 역할: 짧은 UI 레이블 또는 네비게이션 아이템. 보이는 곳: 컴포넌트 랜딩/자동화 기능. astro. 메시지 키 `landing_automation_build` (랜딩 자동화 빌드).
-
: iOS 앱 빌드 번호와 일치 바로 가기 서명 및 기능
- 활성화 자동으로 서명 관리
- 선택하세요 팀
- 컨텍스트: Capgo 마케팅 웹사이트. 역할: 짧은 UI 레이블 또는 네비게이션 아이템. 보이는 곳: 페이지 sla.astro. 메시지 키 `team_plan` (팀 플랜).
-
Xcode는 자동으로 배포 프로파일을 생성합니다. 설정:
- 배포 정보최소 배포
: watchOS 9.0 이상
4단계: CapgoWatchSDK를 Swift Package Manager를 통해 추가하세요제목: 4단계: CapgoWatchSDK를 Swift Package Manager를 통해 추가하세요 WatchConnector 통신을 위한 클래스.
-
In Xcode에서 다음을 클릭하세요. File → Add Package Dependencies…
-
검색란에 입력하세요:
https://github.com/Cap-go/capacitor-watch.git -
Enter를 누르고 Xcode가 패키지를 가져올 때까지 기다리세요.
-
패키지를 구성하세요:
- 의존성 규칙: '8.0.0'까지의 주요 버전까지'와 함께
- 클릭 패키지를 추가
-
추가할 제품을 선택하세요:
- 중요: 오직 선택
CapgoWatchSDK - 시작하기 전에 watch 대상에 추가되어야 합니다 (예: "MyWatch"), iOS 앱이 아닌
- 클릭 패키지 추가
- 중요: 오직 선택
5단계: 시계 앱 구현
제목: 5단계: 시계 앱 구현시계 앱을 만들 차례입니다. code. 다음 파일을 생성한 후 자동으로 생성된 파일을 대체하세요.
5.1 앱 진입점 만들기
제목: 5.1 앱 진입점 만들기수정 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 메인 뷰 만들기
제목: 5.2 메인 뷰 만들기수정 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()}6단계: WatchConnectivity를 위한 iOS 앱 구성
Step 6: WatchConnectivity를 위한 iOS 앱 구성하기iOS 앱도 WatchConnectivity 기능이 필요합니다.
-
프로젝트 탐색기에서 프로젝트를 선택하세요
-
프로젝트 iOS 앱 목표 시계 목표가 아닌 iOS 앱 목표를 선택하세요
-
Signing & Capabilities 탭으로 이동하세요 탭 기능 추가
-
기능 추가 WatchConnectivity 기능 추가
-
Search for and add WatchConnectivity capability WatchConnectivity (사용 가능할 경우) 또는 자동으로 추가될 수 있습니다.
-
Capacitor 플러그인은 iOS 측을 자동으로 처리하지만, Info.plist에 다음 항목이 포함되어 있어야 합니다.
<key>WKCompanionAppBundleIdentifier</key><string>app.capgo.myapp.watchkitapp</string>
7단계: 빌드 및 실행
7단계: 빌드 및 실행심уля터에서 실행
심уля터에서 실행-
Xcode 창 상단의 스케쥬 선택기에서 시계 스케쥬를 선택하세요.
-
시계 시뮬레이터를 선택하세요:
- 디바이스 선택기 옆의 클릭하여 디바이스를 선택하세요.
- Apple Watch 시뮬레이터를 선택하세요 (예: "Apple Watch Series 9 (45mm)")
-
iPhone과 Apple Watch를 동시에 실행하는 iOS 시뮬레이터를 클릭하세요. 실행 버튼 (▶️) 또는
Cmd + R -
iPhone과 Apple Watch를 동시에 실행하는 iOS 시뮬레이터가 실행됩니다.
실제 기기에서 실행
실제 기기에서 실행하는 섹션-
iPhone과 Apple Watch를 연결하기 위해 USB를 사용하세요.
-
iPhone과 Apple Watch가 pair되어 있어야 합니다.
-
시계 스키마를 선택하세요.
-
실제 Apple Watch를 선택하세요.
-
클릭 실행
-
처음 사용: 양쪽 기기에서 컴퓨터에 신뢰를 할당해야 할 수 있습니다
8단계: 통신 테스트
8단계: 통신 테스트iPhone (Capacitor)에서 시계로
iPhone (Capacitor)에서 시계로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!' } });}Watch에서 iPhone으로
Watch에서 iPhone으로Watch 앱은 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)")}iPhone에서 메시지 처리
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'] } });});고급: 사용자 지정 위임자
Section titled “고급: 사용자 지정 위임자”더 많은 제어를 원한다면 implement 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()시계 앱이 시계에 나타나지 않습니다.
Section titled “시계 앱이 시계에 나타나지 않습니다.”- 시계 앱과 iOS 앱의 번들 ID가 올바르게 연결되어 있는지 확인하세요. (시계 앱의 번들 ID는 iOS 앱의 번들 ID +)
.watchkitapp) - 두 앱이 동일한 팀으로 서명되어 있는지 확인하세요.
- 물리적 장치에서: iPhone에서 시계 앱을 열고 → My Watch → 앱을 찾으세요 → toggle ON
메시지가 수신되지 않습니다.
Section titled “메시지가 수신되지 않습니다.”- 두 앱이 WCSession이 활성화되어 있는지 확인하세요.
- 확인하세요.
isReachable메시지를 전송하기 전에 - 보장된 전달을 위해 사용하세요.
transferUserInfo대신sendMessage - 다른 기기에서 메시지를 보내기 전에 리스너가 등록되어 있는지 확인하세요
세션 활성화되지 않은 오류
세션 활성화되지 않은 오류- 호출
WatchConnector.shared.activate()앱 라이프 사이클의 초기 단계에 호출하세요 - iOS에서 플러그인은 자동으로 활성화되므로 플러그인을 임포트하세요
- iOS 대상에 WatchConnectivity 기능이 추가되어 있는지 확인하세요
CapgoWatchSDK와 관련된 빌드 오류
CapgoWatchSDK와 관련된 빌드 오류- 패키지가 watch 대상에 추가되어 있는지 확인하세요 watch 대상에 패키지를 추가하세요, iOS 목표가 아닌
- 빌드 폴더 청소: Product → 빌드 폴더 청소 (Cmd + Shift + K)
- 패키지 캐시 초기화: File → Packages → 패키지 캐시 초기화
Simulator 문제
Simulator 문제 섹션- 심уля터 초기화: Device → 모든 콘텐츠 및 설정 삭제
- iOS 및 watchOS 시뮬레이터가 호환되는 pairs를 확인하십시오
- 두 시뮬레이터가 모두 실행 중이어야 통신이 작동합니다
다음 단계
다음 단계Creating a watchOS 앱에서 계속
Section titled “Creating a watchOS 앱에서 계속”만약에 당신이 사용하고 있다면 Creating a watchOS 앱 native 플러그인 작업을 계획하려면, 그것을 연결하세요. Using @capgo/capacitor-watch native 기능을 사용하는 @capgo/capacitor-watch Capgo 플러그인 디렉토리 제품 워크플로우를 사용하는 @Capgo 플러그인 디렉토리 Capacitor 플러그인들에 의해 Capgo 제품 워크플로우를 사용하는 @Capacitor 플러그인들에 의해 Capgo 플러그인 추가 또는 업데이트 플러그인 추가 또는 업데이트 구현 세부 정보 Ionic Enterprise 플러그인 대체 제품 워크플로우를 사용하는 Ionic Enterprise 플러그인 대체