url_launcher_watchos

The watchOS implementation of url_launcher, built for the flutter-watchos toolchain.

A small FFI package — no method channels (watchOS does not support them).

Usage

Add it alongside the app-facing package; you keep calling url_launcher's own API.

dependencies:
  url_launcher: any
  url_launcher_watchos: ^0.0.1

What watchOS can actually do

watchOS has no general "open this URL" call and no WebKit in the SDK, so this package maps each scheme to the one mechanism that fits it:

Scheme Behaviour
tel:, sms: Opened on the watch by the system handler, via -[WKApplication openSystemURL:] (watchOS 7+).
http:, https: The watch shows the system sheet — which tells the user the link can be viewed on their iPhone — and an NSUserActivity (NSUserActivityTypeBrowsingWeb) is published so the phone or Mac can pick it up via Handoff.
anything else launchUrl returns false.

mailto: is deliberately not claimed: openSystemURL: does not own it, and because that method returns void an unowned scheme fails silently — reporting success would be a lie.

true means "handed off", not "opened"

watchOS reports no completion for either mechanism, so a true result means the URL was accepted by the system — not that the user followed it. For a web link the user still has to pick up the Handoff on their phone.

All four behaviours above are verified on an Apple Watch Ultra 3 (watchOS 26.5, release build): tel: and sms: raise the system call and compose UI, and a web URL shows the sheet on the watch while the Handoff icon appears on the paired iPhone and opens the page.

In-app web views do not exist

PreferredLaunchMode.inAppWebView and inAppBrowserView report unsupported, and supportsCloseForMode is always false. closeWebView() withdraws the published Handoff activity, which is the nearest equivalent.

watchOS genuinely has a browser — WebSheet.framework, which is what Weather and Mail present — but it is a private framework, as is the rest of the web stack (WebCore, MobileSafari, SafariSharedUI). WebKit itself ships in the OS but is absent from the SDK, and WKWebView is a UIView, which watchOS SwiftUI cannot host (there is no UIViewRepresentable).

Passing an https URL to openSystemURL: from a third-party app does raise the system sheet — the documentation's tel:/sms:-only list is incomplete — but the sheet then refuses to render and points at the iPhone. Verified on an Apple Watch Ultra 3 (watchOS 26.5) with example.com, so this is policy rather than a page that happened to fail. That prompt is why this package makes the call anyway: the user gets told, on the wrist, where their link went.

Testing

UrlLauncherWatchos.bindingsOverride accepts a fake extending UrlLauncherWatchosBindings.forTesting(), so the Dart layer is testable off device.