iOS App에서 Apple watch app으로 message를 전송하는 방법입니다.
참고로 제가 사용한 기기는 Apple Watch Series 7와 iPhone 11이며, SwiftUI를 사용했습니다.
1. 프로젝트 생성
Create a new Xcode project로 새로운 프로젝트 생성
Choose a template for your new project: 에서 watchOS를 선택한 다음, Application에서 iOS App with Watch App을 선택하고 Next 버튼을 클릭합니다.
Product Name을 입력하고 Next를 클릭합니다.
Project를 생성할 folder를 선택한 후 Create를 클릭합니다. 그럼 다음과 같이 Project가 생성됩니다.
2. iOS(Phone) App 구현
iOS에 새로운 ViewModelPhone 파일을 swift file로 생성합니다.
그리고 다음 코드를 입력합니다.
import Foundation import WatchConnectivity class ViewModelPhone : NSObject, WCSessionDelegate{ var session: WCSession init(session: WCSession = .default){ self.session = session super.init() self.session.delegate = self session.activate() } func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { } func sessionDidBecomeInactive(_ session: WCSession) { } func sessionDidDeactivate(_ session: WCSession) { } } |
다음으로 ContentView의 코드를 수정합니다.
default code:
struct ContentView: View { var body: some View { Text("Hello, world!") .padding() } } |
수정된 code:
struct ContentView: View { var model = ViewModelPhone() @State var reachable = "No" @State var messageText = "" var body: some View { VStack{ Text("Reachable \(reachable)") Button(action: { if self.model.session.isReachable{ self.reachable = "Yes" } else{ self.reachable = "No" } }) { Text("Update") } TextField("Input your message", text: $messageText) Button(action: { self.model.session.sendMessage(["message" : self.messageText], replyHandler: nil) { (error) in print(error.localizedDescription) } }) { Text("Send Message") } } } } |
3. Apple watch App 구현
Apple watch에 새로운 ViewModelWatch 파일을 swift file로 생성합니다.
그리고 다음 코드를 입력합니다.
import Foundation import WatchConnectivity class ViewModelWatch : NSObject, WCSessionDelegate, ObservableObject { var session: WCSession @Published var messageText = "" init(session: WCSession = .default){ self.session = session super.init() self.session.delegate = self session.activate() } func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { } func session(_ session: WCSession, didReceiveMessage message: [String : Any]) { DispatchQueue.main.async { self.messageText = message["message"] as? String ?? "Unknown" } } } |
다음으로 ContentView의 코드를 다음과 같이 수정합니다.
default code:
struct ContentView: View { var body: some View { Text("Hello, World!") .padding() } } |
수정된 code:
struct ContentView: View { @ObservedObject var model = ViewModelWatch() var body: some View { Text(self.model.messageText) } } |
4. Simulator로 실행
apple watch simulator가 없거나 iPhone과 pair가 되지 않았을 때는 다음 글을 참조해서 apple watch simulator를 추가 합니다.
2022.06.28 - [다시 개발자] - Xcode에 apple watch simulator 추가
simulator를 실행할 때 phone을 먼저 실행 한 후 watch를 실행하면 제대로 동작을 안 할 때가 있습니다.
이유는 phone에서 watch와 session을 맺으려고 하는 watch가 실행되지 않아 연결을 하지 못해서 입니다.
그래서 simulator를 실행할 때 watch를 먼저 실행한 후 phone을 실행하는 것이 좋습니다.
참조한 글:
https://betterprogramming.pub/get-started-with-watch-connectivity-with-swiftui-51722324b6f6
'다시 개발자' 카테고리의 다른 글
Google Play 개발자 계정, 조직 계정으로 등록하기 (1) | 2022.07.14 |
---|---|
Xcode에 apple watch simulator 추가 (0) | 2022.06.28 |
Failed to register bundle identifier 에러 처리 (0) | 2022.06.13 |
CentOS gcc 설치 오류 해결 방법 (0) | 2022.06.07 |
Linux CentOS에 python 3 설치 (0) | 2022.06.07 |
댓글