> For the complete documentation index, see [llms.txt](https://docs.tryterra.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tryterra.co/help-center/help-topics/data-api-sdk/realtime-streaming-and-ble/apple-watch-streaming-watchos-companion.md).

# How do I make Apple Watch streaming work from Flutter?

Apple Watch streaming requires a separate watchOS companion target, managed natively in Xcode and written in Swift, even when the main app is Flutter or React…

**Apple Watch streaming requires a separate watchOS companion target, managed natively in Xcode and written in Swift**, even when the main app is Flutter or React Native (Flutter cannot build watchOS targets). The Flutter/phone side acts as observer.

{% stepper %}
{% step %}
Add `TerraRTiOS` to the watchOS target through CocoaPods.
{% endstep %}

{% step %}
Enable **HealthKit** and **Background Modes** on the watchOS target, and add the Health Share, Health Update and Health Records usage descriptions to the watch target's own `Info.plist`.
{% endstep %}

{% step %}
In the watch app, call `connect()`, then `startStream(forDataTypes:)` or `startExercise(forType:)`. On the phone, start realtime streaming with the `WATCH_OS` connection type, not the phone's `apple` connection.
{% endstep %}
{% endstepper %}

The watch then pushes updates to the phone like any BLE device, so no special concurrency handling is needed on the watch side. See [connecting a wearable to the SDK on iOS](https://docs.tryterra.co/streaming-api/connect-wearable-to-sdk/ios-swift).

**`connectWatchOS()` in Flutter or `connectWithWatchOS()` in React Native succeeding only means the phone has opened its session with the paired watch.** It doesn't mean the watch app has HealthKit permission or is streaming. Nothing on the phone starts the stream, so if no updates arrive, log the result of the watch's `startStream` or `startExercise` call, which carries the error.

Without a workout running, the watch records data less often. Use `startExercise` for the highest frequency. The watch stream supports steps, location, calories, heart rate, HRV, speed, distance, step cadence, floors climbed, gyroscope and acceleration.

If streaming doesn't restart after the watch app calls `stopStream()` and then `startStream()`, upgrade the watch target to TerraRTiOS 0.3.15 or later.
