first commit
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
import Foundation
|
||||
import WatchConnectivity
|
||||
import Combine
|
||||
|
||||
// MARK: - Та же лёгкая модель трека, что и на телефоне
|
||||
struct WatchTrackInfo: Codable, Identifiable {
|
||||
let id: String
|
||||
let title: String
|
||||
let artist: String
|
||||
}
|
||||
|
||||
// MARK: - Связь Apple Watch <-> iPhone
|
||||
// Добавь этот файл в таргет часов (например "music playerWatch").
|
||||
class WatchConnectivityManager: NSObject, WCSessionDelegate, ObservableObject {
|
||||
static let shared = WatchConnectivityManager()
|
||||
|
||||
@Published var tracks: [WatchTrackInfo] = []
|
||||
@Published var isPlaying: Bool = false
|
||||
@Published var currentTitle: String = ""
|
||||
@Published var currentArtist: String = ""
|
||||
@Published var currentId: String = ""
|
||||
|
||||
private override init() {
|
||||
super.init()
|
||||
guard WCSession.isSupported() else { return }
|
||||
let session = WCSession.default
|
||||
session.delegate = self
|
||||
session.activate()
|
||||
}
|
||||
|
||||
// MARK: - WCSessionDelegate
|
||||
|
||||
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {}
|
||||
|
||||
func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String: Any]) {
|
||||
DispatchQueue.main.async {
|
||||
self.apply(applicationContext)
|
||||
}
|
||||
}
|
||||
|
||||
private func apply(_ context: [String: Any]) {
|
||||
if let data = context["tracks"] as? Data,
|
||||
let decoded = try? JSONDecoder().decode([WatchTrackInfo].self, from: data) {
|
||||
self.tracks = decoded
|
||||
}
|
||||
self.isPlaying = context["isPlaying"] as? Bool ?? false
|
||||
self.currentTitle = context["currentTitle"] as? String ?? ""
|
||||
self.currentArtist = context["currentArtist"] as? String ?? ""
|
||||
self.currentId = context["currentId"] as? String ?? ""
|
||||
}
|
||||
|
||||
// MARK: - Отправка команд на телефон
|
||||
|
||||
private func send(action: String, extra: [String: Any] = [:]) {
|
||||
guard WCSession.isSupported() else { return }
|
||||
var payload = extra
|
||||
payload["action"] = action
|
||||
|
||||
let session = WCSession.default
|
||||
if session.isReachable {
|
||||
session.sendMessage(payload, replyHandler: nil) { _ in
|
||||
session.transferUserInfo(payload)
|
||||
}
|
||||
} else {
|
||||
session.transferUserInfo(payload)
|
||||
}
|
||||
}
|
||||
|
||||
func playPause() { send(action: "playPause") }
|
||||
func next() { send(action: "next") }
|
||||
func previous() { send(action: "previous") }
|
||||
func playTrack(id: String) { send(action: "playTrack", extra: ["id": id]) }
|
||||
}
|
||||
Reference in New Issue
Block a user