티스토리 뷰

반응형
SMALL

이번 포스트에서는 아이폰과 애플 워치 간 데이터를 주고 받는 방법에 대해 살펴보도록 하겠습니다.

애플 워치의 경우 단독으로 동작하는 앱도 있지만 대부분은 Host App과 통신하면서 동작하는 App이 많습니다.

심박수, 걸음 수 등 각종 건강 정보 역시 Host App (iPhone)으로 데이터를 전송하면서 동작합니다.

 

이렇듯 애플 워치와 아이폰 간 데이터를 주고 받는 방법을 아는 것은 굉장히 중요합니다.

XCode 프로젝트 생성하기

iOS App with Watch App 을 선택하여 아이폰과 함께 동작하는 (독립적이지 않은) App을 개발하도록 선택해줍니다.

프로젝트 이름을 적절하게 입력해주시고 기타 설정은 기본 값을 유지하도록 합니다.

레이아웃 구성하기

프로젝트 생성이 완료되었다면 레이아웃을 구성할 차례입니다. Storyboard에 위와 같이 UILabel 1개와 UIButton 2개를 배치해줍니다.

(버튼은 데이터를 전송하는 버튼, 레이블의 값을 초기화하는 버튼 총 2개입니다.)

 

애플 워치 쪽 Interface에는 아래와 같이 레이아웃을 구성해줍니다.

아이폰과 동일한 형태로 레이아웃을 구성해줍니다. 아이폰과 마찬가지로 아이폰으로부터 받은 데이터를 UILabel에 보여주고 버튼을 통해 데이터를 전송, 받은 값을 초기화하는 버튼을 스토리보드에 추가해줍니다.

코드 작성

View Controller과 Interface Controller에 적절한 코드를 삽입해줍니다.

iPhone과 Apple Watch를 서로 연결하기 위해 Watch Connectivity를 import하여 작업합니다.

import UIKit
import WatchConnectivity

class ViewController: UIViewController {
    var session: WCSession?
    
    @IBOutlet weak var lblContent: UILabel!
    
    @IBAction func onClickSendButton(_ sender: Any) {
        if let validSession = self.session {
            let data: [String: Any] = ["iPhone": "Data from iPhone" as Any]
            validSession.transferUserInfo(data)
        }
    }
    
    @IBAction func onClickReset(_ sender: Any) {
        self.lblContent.text = "Label"
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.configureWatchKitSesstion()
    }
    
    func configureWatchKitSesstion() {
        
        if WCSession.isSupported() {
            session = WCSession.default
            session?.delegate = self
            session?.activate()
        }
    }

}

extension ViewController: WCSessionDelegate {
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
        
    }
    
    func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
        print("received data: \(userInfo)")
        DispatchQueue.main.async {
            if let value = userInfo["watch"] as? String {
                self.lblContent.text = value
            }
        }
    }
    
    func sessionDidBecomeInactive(_ session: WCSession) {
        
    }
    
    func sessionDidDeactivate(_ session: WCSession) {
        
    }
}

위 코드는 View Controller 쪽 코드입니다. 

import WatchKit
import Foundation
import WatchConnectivity

class InterfaceController: WKInterfaceController {
    @IBOutlet weak var label: WKInterfaceLabel!
    let session = WCSession.default
    
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        
        // Configure interface objects here.
        session.delegate = self
        session.activate()
    }
    
    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()
    }
    
    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
        super.didDeactivate()
    }
    
    @IBAction func onClickReset() {
        label.setText("Label")
    }
    
    @IBAction func tapSendToiPhone() {
        let data: [String: Any] = ["watch": "data from watch" as Any]
        session.transferUserInfo(data)
    }

}

extension InterfaceController: WCSessionDelegate {
    
    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
    }
    
    func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
        print("received data: \(userInfo)")
        DispatchQueue.main.async {
            if let value = userInfo["iPhone"] as? String {
                self.label.setText(value)
            }
        }
    }
}

위 코드는 애플 워치 쪽 Interface Controller 부분입니다.

View Controller과 Interface Controller 모두 IBOutlet 변수로 Storyboard 상의 View와 연결해주었습니다.

 

Dispatch Queue를 사용하여 데이터를 받아올 때 Foreground가 아닌 Background로 처리하도록 구현하였습니다.

데이터 전송을 할 때 즉시 전송되는 것이 아니라 지연이 발생하기 때문에 Dispatch Queue를 사용하는게 좋습니다.

 

실행을 해보면 애플 워치와 아이폰에 각각 올바른 값이 전송되는 것을 볼 수 있습니다.

 

이번 포스트에서는 아이폰과 애플 워치 간의 데이터 주고 받는 방법에 대해 살펴보았습니다.

반응형
LIST

'Frontend > watchOS' 카테고리의 다른 글

[watchOS] Apple Watch Life Cycle  (0) 2020.03.03
[watchOS] 간단한 Watch OS 앱 만들기  (0) 2020.03.02
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함