Skip to content

Commit

Permalink
Merge branch 'develop' into Fix/#32-LiveActivityButton
Browse files Browse the repository at this point in the history
  • Loading branch information
KimPilGyeom authored Nov 6, 2024
2 parents 7662a09 + 7e6a094 commit bc70d30
Show file tree
Hide file tree
Showing 24 changed files with 676 additions and 451 deletions.
54 changes: 45 additions & 9 deletions hearo/HearoadWatch Watch App/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,54 @@ import SwiftUI
import WatchKit

struct ContentView: View {
@ObservedObject private var sessionManager = WatchSessionManager.shared

@ObservedObject var sessionManager = WatchSessionManager.shared
var body: some View {
VStack {
Text("소리 감지: \(sessionManager.alertMessage)")
.font(.headline)
.foregroundColor(.red)
.padding()
ZStack {
// 배경색을 alert 상태에 따라 변경
sessionManager.isAlerting ? Color.red.edgesIgnoringSafeArea(.all) : Color.black.edgesIgnoringSafeArea(.all)

Button("진동 테스트") {
WKInterfaceDevice.current().play(.notification) // 수동으로 진동 테스트
VStack {
// 상태에 따른 텍스트 표시
Text(sessionManager.isAlerting ? sessionManager.alertMessage : "인식중")
.foregroundColor(.white)
.font(.title)
.padding()


// 알림 아이콘을 표시하고, 알림이 아닐 때는 숨김 처리
if sessionManager.isAlerting {
Image(systemName: "exclamationmark.triangle.fill")
.resizable()
.frame(width: 50, height: 50)
.foregroundColor(.yellow)
.padding()
}
}
}
.onAppear {
// 초기화
sessionManager.resetAlert()
}
}
}
//struct ContentView: View {
// @ObservedObject var viewManager = WatchViewManager()
//
// var body: some View {
// VStack {
// if viewManager.currentView == "working" {
// WatchWorkingView()
// } else if viewManager.currentView == "warning" {
// WatchWarningView()
// } else if viewManager.currentView == "finish" {
// WatchFinishView()
// } else {
// WatchHomeView()
// }
// }
// .onAppear {
// print("현재 Watch 뷰: \(viewManager.currentView)")
// }
// }
//}
8 changes: 8 additions & 0 deletions hearo/HearoadWatch Watch App/HearoadWatch.entitlements
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.watchkit.extended-runtime-session</key>
<true/>
</dict>
</plist>
87 changes: 34 additions & 53 deletions hearo/HearoadWatch Watch App/WatchSessionManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,83 +8,64 @@ import Foundation
import WatchKit
import WatchConnectivity

class WatchSessionManager: NSObject, ObservableObject, WCSessionDelegate, WKExtendedRuntimeSessionDelegate {
func extendedRuntimeSession(_ extendedRuntimeSession: WKExtendedRuntimeSession, didInvalidateWith reason: WKExtendedRuntimeSessionInvalidationReason, error: Error?) {
switch reason {
case .expired:
print("세션이 만료되었습니다.")
default:
print("알 수 없는 이유로 세션이 만료되었습니다.")
}

if let error = error {
print("세션 만료 오류: \(error.localizedDescription)")
}

// 세션 만료 후 백그라운드 세션을 다시 시작
startBackgroundSession()
}
class WatchSessionManager: NSObject, ObservableObject, WCSessionDelegate {
static let shared = WatchSessionManager() // 싱글톤 인스턴스 생성

@Published var alertMessage: String = "대기 중"
private var backgroundSession: WKExtendedRuntimeSession?

@Published var alertMessage: String = "인식중" // 기본 메시지
@Published var isAlerting: Bool = false // 알림 상태 확인
private override init() {
super.init()

if WCSession.isSupported() {
WCSession.default.delegate = self
WCSession.default.activate()
}

startBackgroundSession() // 백그라운드 세션 시작
}

// 백그라운드 실행을 위한 세션 시작
private func startBackgroundSession() {
backgroundSession = WKExtendedRuntimeSession()
backgroundSession?.delegate = self
backgroundSession?.start()
}


// iOS에서 경고 메시지를 수신하는 메서드
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
if let alert = message["alert"] as? String {
DispatchQueue.main.async {
print("watch alarm 감지:", alert)
self.alertMessage = alert
WKInterfaceDevice.current().play(.notification) // 진동 알림 발생
self.showAlert(alertMessage: alert)
self.showAlert(with: alert)
}
}
}

// 알림 팝업을 표시하는 메서드
private func showAlert(alertMessage: String) {
let action = WKAlertAction(title: "확인", style: .default) { }

// 3초 동안 알림 표시 후 기본 상태로 복구
func showAlert(with message: String) {
alertMessage = message
isAlerting = true

// 현재 활성화된 인터페이스 컨트롤러에서 경고를 표시
if let controller = WKExtension.shared().visibleInterfaceController {
controller.presentAlert(withTitle: "경고", message: alertMessage, preferredStyle: .alert, actions: [action])
// 강한 진동 알림 발생
playUrgentHapticPattern()

// 3초 후에 기본 상태로 복구
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.resetAlert()
}
}

// WKExtendedRuntimeSessionDelegate - 세션 시작
func extendedRuntimeSessionDidStart(_ extendedRuntimeSession: WKExtendedRuntimeSession) {
print("배경 세션 시작됨")
// 긴급 상황을 위한 강한 진동 패턴
func playUrgentHapticPattern() {
// 반복 횟수 및 간격 설정
let repeatCount = 5 // 진동 반복 횟수
let interval: TimeInterval = 0.1 // 반복 간격 (0.1초)

// 반복적으로 강한 진동을 재생하는 패턴
for i in 0..<repeatCount {
DispatchQueue.main.asyncAfter(deadline: .now() + (interval * Double(i))) {
WKInterfaceDevice.current().play(.failure) // 강한 피드백을 주는 진동
}
}
}

// WKExtendedRuntimeSessionDelegate - 세션 만료 예정
func extendedRuntimeSessionWillExpire(_ extendedRuntimeSession: WKExtendedRuntimeSession) {
print("배경 세션 만료 예정")
}

// WKExtendedRuntimeSessionDelegate - 세션 만료 후 다시 시작
func extendedRuntimeSessionDidInvalidate(_ extendedRuntimeSession: WKExtendedRuntimeSession) {
print("배경 세션 만료됨")
startBackgroundSession() // 세션 만료 시 다시 시작
// 기본 상태로 복구하는 메서드
func resetAlert() {
alertMessage = "인식중"
isAlerting = false
}

// WCSession 활성화 완료 시 호출되는 메서드
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {
print("애플워치 - WCSession 활성화 완료. 상태: \(activationState.rawValue)")
Expand Down
12 changes: 1 addition & 11 deletions hearo/HearoadWatch-Watch-App-Info.plist
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>remote-notification</string>
</array>
<key>WKBackgroundModes</key>
<array>
<string>App downloads content from the network </string>
</array>
</dict>
<dict/>
</plist>
Loading

0 comments on commit bc70d30

Please sign in to comment.