본문 바로가기
다시 개발자

iOS App에서 Apple watch로 message를 전송하는 방법

by 까삼스 이삐 2022. 6. 28.
728x90
반응형

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 추가

 

Xcode에 apple watch simulator 추가

xcode에 apple watch simulator를 추가하는 방법입니다. 실행시킬 대상 맨 아래 "Add Additional Simulators..."를 선택합니다. 왼쪽 상단에 "Simulators"를 선택합니다. 그리고 watch는 phone과 pairing이 되..

kka3seb.tistory.com

 

 

simulator를 실행할 때 phone을 먼저 실행 한 후 watch를 실행하면 제대로 동작을 안 할 때가 있습니다.

이유는 phone에서 watch와 session을 맺으려고 하는 watch가 실행되지 않아 연결을 하지 못해서 입니다.

그래서 simulator를 실행할 때 watch를 먼저 실행한 후 phone을 실행하는 것이 좋습니다.

 

참조한 글:

https://betterprogramming.pub/get-started-with-watch-connectivity-with-swiftui-51722324b6f6

 

Get Started With Watch Connectivity With SwiftUI

Illustrating connectivity with a simple sample application

betterprogramming.pub

 

728x90
반응형

댓글