Реалізація синхронізації даних розумного годинника з мобільним додатком

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація синхронізації даних розумного годинника з мобільним додатком
Середній
~1-2 тижні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація синхронізації даних умних годин з мобільним додатком

Apple Watch та Wear OS — дві принципово різні екосистеми синхронізації. У Apple — WatchConnectivity framework з жорсткими обмеженнями на передачу. У Google — Data Layer API поверх BLE-стека. Крос-платформенний React Native або Flutter тут не допоможе: синхронізація з годин вимагає нативного коду на Swift/WatchKit та Kotlin/Wearable Data Layer.

Apple Watch: WatchConnectivity

WCSession — єдиний канал між iPhone-додатком та Watch App. Три методи передачи з різною семантикою:

Метод Доставка Розмір Фон Сценарій
sendMessage Негайно < 64 KB Тільки коли годинник достижимий Команди в реальному часі
transferUserInfo FIFO-черга Малий словник Так, при першій можливості Налаштування, конфіг
transferFile Фонова передача До кількох MB Так Треки, аудіо, великі дані
// iPhone → Watch: терміновий команда
class PhoneSessionManager: NSObject, WCSessionDelegate {
    func sendWorkoutCommand(_ command: WorkoutCommand) {
        guard WCSession.default.isReachable else {
            // Годинник недостижимий — ставимо у чергу через transferUserInfo
            WCSession.default.transferUserInfo(["pending_command": command.rawValue])
            return
        }

        WCSession.default.sendMessage(
            ["command": command.rawValue, "timestamp": Date().timeIntervalSince1970],
            replyHandler: { reply in
                print("Watch acknowledged: \(reply)")
            },
            errorHandler: { error in
                // sendMessage упаде якщо годинник розрядився або вийшов з радіуса
                self.queueCommandForLater(command)
            }
        )
    }
}

Важливе обмеження: sendMessage працює тільки якщо WCSession.default.isReachable == true. Це значит годинник не тільки у зоні BLE, але й його додаток активний або у фоні з дозволом. Якщо користувач закрив Watch App — isReachable повернає false навіть коли годинник рядом.

Синхронізація тренувальних даних: Watch → iPhone

Після тренування Watch App збирає дані (ЧСС, каденс, GPS-трек, сегменти) та передає на iPhone:

// Watch App — відправка після завершення тренування
func finishWorkout(_ session: HKWorkoutSession) {
    let workoutData = WorkoutSummary(
        duration: session.currentActivity.duration,
        heartRateSamples: collectedHRSamples,
        route: collectedLocations,
    )

    guard let encoded = try? JSONEncoder().encode(workoutData) else { return }

    // Для великих даних (GPS-трек 10k точок) — transferFile
    if encoded.count > 32_768 {
        let tempUrl = FileManager.default.temporaryDirectory
            .appendingPathComponent(UUID().uuidString + ".workout")
        try? encoded.write(to: tempUrl)
        WCSession.default.transferFile(tempUrl, metadata: ["type": "workout"])
    } else {
        WCSession.default.transferUserInfo(["workout": encoded.base64EncodedString()])
    }
}

На iPhone приймаємо через session(_:didReceiveFile:) або session(_:didReceiveUserInfo:). Файл потрібно перемістити з documentDirectory сесії до виходу з делегатного методу — інакше iOS видалить його.

Wear OS: Wearable Data Layer API

Android-сторона — DataClient, MessageClient, ChannelClient з com.google.android.gms:play-services-wearable.

// Відправка даних з годин на телефон через DataItem
class WorkoutDataService : WearableListenerService() {

    override fun onDataChanged(dataEvents: DataEventBuffer) {
        dataEvents.forEach { event ->
            if (event.type == DataEvent.TYPE_CHANGED) {
                val path = event.dataItem.uri.path ?: return@forEach
                when {
                    path.startsWith("/workout/completed") -> {
                        val dataMap = DataMapItem.fromDataItem(event.dataItem).dataMap
                        val workoutJson = dataMap.getString("workout_json")
                        processCompletedWorkout(workoutJson)
                    }
                }
            }
        }
    }
}

// На годинах — запис DataItem
suspend fun uploadWorkoutData(summary: WorkoutSummary) {
    val dataMap = PutDataMapRequest.create("/workout/completed").apply {
        dataMap.putString("workout_json", Json.encodeToString(summary))
        dataMap.putLong("timestamp", System.currentTimeMillis())
    }

    Wearable.getDataClient(context).putDataItem(dataMap.asPutDataRequest()
        .setUrgent())  // setUrgent() — без затримки синхронізації
        .await()
}

DataItem реплікується автоматично — не потрібно стежити за станом з'єднання. Wear OS сама синхронізує коли годинник підключається до телефона.

HealthKit: читання даних тренування на iPhone

Дані тренування, записані Watch App через HealthKit, доступні iPhone-додатку напрямку — без WatchConnectivity:

func fetchRecentWorkouts(limit: Int = 10) async throws -> [HKWorkout] {
    let type = HKObjectType.workoutType()
    let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
    let query = HKSampleQuery(sampleType: type, predicate: nil,
                              limit: limit, sortDescriptors: [sort]) { _, samples, error in
        // обробка
    }
    healthStore.execute(query)
}

Для GPS-трека тренування — HKWorkoutRoute через HKWorkoutRouteQuery. Запитувати потрібно окремо після отримання HKWorkout — маршрут зберігається як зв'язаний об'єкт.

Розробка синхронізації даних умних годин (Apple Watch + Wear OS) з мобільним додатком: 4–6 тижнів. Вартість розраховується індивідуально після аналізу необхідних типів даних та платформ.