From 93786b4a9c9a9faabc48ecc6d23755ee6045e08b Mon Sep 17 00:00:00 2001 From: Amir Zarrinkafsh <3339418+nightah@users.noreply.github.com> Date: Tue, 7 Apr 2026 21:23:09 +1000 Subject: [PATCH] refactor(calendar): open native url schemes from meeting buttons Open conference meetings directly via native app URL schemes instead of routing through the browser. Adds native scheme support for Zoom, Teams, FaceTime, and Discord with fallback to HTTPS. --- .../Calendar/DynamicIslandCalendar.swift | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/DynamicIsland/components/Calendar/DynamicIslandCalendar.swift b/DynamicIsland/components/Calendar/DynamicIslandCalendar.swift index 11c62dc..c876a1e 100644 --- a/DynamicIsland/components/Calendar/DynamicIslandCalendar.swift +++ b/DynamicIsland/components/Calendar/DynamicIslandCalendar.swift @@ -1010,6 +1010,16 @@ enum ConferenceProvider: CaseIterable { } } + var nativeURLScheme: String? { + switch self { + case .zoom: return "zoommtg" + case .teams: return "msteams" + case .facetime: return "facetime" + case .discord: return "discord" + default: return nil + } + } + static func detect(from url: URL) -> ConferenceProvider { let host = url.host?.lowercased() ?? "" return allCases.first { provider in @@ -1035,7 +1045,17 @@ struct ConferenceJoinButton: View { } var body: some View { - Button(action: { openURL(url) }) { + Button(action: { + if let scheme = provider.nativeURLScheme, + var components = URLComponents(url: url, resolvingAgainstBaseURL: false) { + components.scheme = scheme + if let nativeURL = components.url { + openURL(nativeURL) + return + } + } + openURL(url) + }) { HStack(spacing: 4) { Image(systemName: "video.fill") .font(.system(size: 9))