SecureStorageSample/SecureStorageSample Watch App
2026-01-16 16:02:11 -06:00
..
Assets.xcassets Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-14 08:51:34 -06:00
Design Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-16 15:53:15 -06:00
Protocols Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-14 09:22:55 -06:00
Services Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-16 15:53:15 -06:00
State Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-16 15:53:15 -06:00
ContentView.swift Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-16 15:53:15 -06:00
README.md Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-16 16:02:11 -06:00
SecureStorageSample Watch App.entitlements Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-14 15:09:44 -06:00
SecureStorageSampleApp.swift Signed-off-by: Matt Bruce <mbrucedogs@gmail.com> 2026-01-14 08:51:34 -06:00

SecureStorageSample Watch App

A watchOS companion app demonstrating data synchronization with the iOS app using WatchConnectivity.

Overview

This watch app receives UserProfile data and the syncable setting from the paired iPhone via WatchConnectivity. It does not use LocalData directly for storage—instead, it displays synced data in memory.

Architecture

SecureStorageSample Watch App/
├── ContentView.swift           # Displays synced profile data
├── SecureStorageSampleApp.swift
├── Design/
│   └── WatchDesignConstants.swift
├── Protocols/
│   └── WatchDataHandling.swift # Protocol for payload handlers
├── State/
│   └── WatchProfileStore.swift # Holds synced profile in memory
└── Services/
    ├── WatchConnectivityService.swift
    └── Handlers/
        └── UserProfileWatchHandler.swift
        └── SyncableSettingWatchHandler.swift

Data Flow

  1. Watch app requests a sync when it launches or becomes reachable
  2. iOS app replies with a snapshot of syncable keys and updates applicationContext
  3. Watch app receives context in WatchConnectivityService
  4. The service dispatches each payload key to its registered WatchDataHandling handler
  5. Handlers decode values and update WatchProfileStore

Launch-Order-Safe Sync

The watch app handles both cases:

  • If the iPhone is reachable, it sends a request_sync message and applies the reply payload.
  • If the iPhone is not reachable, it queues a request with transferUserInfo and shows a badge.

This ensures users do not need to launch the apps in a specific order.

Adding New Sync Payloads

  1. Create a new handler conforming to WatchDataHandling:
struct MyDataWatchHandler: WatchDataHandling {
    let key = "myData"
    
    func handle(data: Data) {
        // Decode and update state
    }
}
  1. Register it in WatchConnectivityService.registerDefaultHandlers()

Limitations

  • No persistent storage on watch: Data is held in memory only
  • One-way sync: Watch receives data from iPhone; it does not send data back
  • Simulator limitations: WatchConnectivity may not work reliably in the simulator

Requirements

  • watchOS 10.0+
  • Paired with iOS app via WatchConnectivity