feat(flow): harden host handoff, session UX, and Live Activity brand

- fix(keyboard): drop unusable extensionContext.open; report the real
  result of UIApplication.open and cancel the start watchdog immediately
  on failure with clear "open OSGKeyboard" guidance instead of a 30s spin
- feat(capture): recover from audio route changes (AirPods/wired headset
  plug-unplug) and phone-call interruptions by rebuilding the engine/tap
  against the live hardware format
- feat(home): add a "Start" button in the Home footer when a session is
  inactive and permissions are granted (no-jump manual restart)
- feat(hostapps): expand the return whitelist to 46 apps (Signal, Zoom,
  Instagram, X, Douyin, Zhihu, Bilibili, Things, Firefox, ...) with
  en/zh-Hans names and synced LSApplicationQueriesSchemes
- feat(island): use a "ready" checkmark instead of a mic glyph while idle
  and set a staleDate so an orphaned Live Activity fades after a force-quit
- feat(coldstart): use the template OSG brand mark instead of a system
  waveform glyph in the cold-start overlay
- perf(keyboard): rely on Darwin notifications as the primary session
  signal and drop the fallback poll from 1s to 3s
- fix(keyboard): remove the redundant "Start" text button next to the
  inactive-session hint on the keyboard
- docs: correct the per-take cap to 210s (3.5 min) and document that
  force-quitting no longer resurrects the session (tracker + READMEs)
This commit is contained in:
Rocky
2026-07-06 17:56:10 +08:00
parent 6a01b6cf71
commit 9ef0196d52
24 changed files with 560 additions and 197 deletions
@@ -156,6 +156,153 @@ public enum HostAppURLRegistry {
displayNameKey: "hostApp.xiaohongshu",
returnURLString: "xhsdiscover://",
tier: 4
),
// Tier 2 (cont.) global IM / calls
HostAppEntry(
bundleId: "org.whispersystems.signal",
displayNameKey: "hostApp.signal",
returnURLString: "sgnl://",
tier: 2
),
HostAppEntry(
bundleId: "com.iwilab.KakaoTalk",
displayNameKey: "hostApp.kakaotalk",
returnURLString: "kakaotalk://",
tier: 2
),
HostAppEntry(
bundleId: "com.viber",
displayNameKey: "hostApp.viber",
returnURLString: "viber://",
tier: 2
),
HostAppEntry(
bundleId: "com.vng.zaloapp",
displayNameKey: "hostApp.zalo",
returnURLString: "zalo://",
tier: 2
),
HostAppEntry(
bundleId: "com.skype.skype",
displayNameKey: "hostApp.skype",
returnURLString: "skype://",
tier: 2
),
HostAppEntry(
bundleId: "us.zoom.videomeetings",
displayNameKey: "hostApp.zoom",
returnURLString: "zoomus://",
tier: 2
),
// Tier 3 (cont.) notes / mail / browser
HostAppEntry(
bundleId: "com.culturedcode.ThingsiPhone",
displayNameKey: "hostApp.things",
returnURLString: "things://",
tier: 3
),
HostAppEntry(
bundleId: "com.todoist.ios",
displayNameKey: "hostApp.todoist",
returnURLString: "todoist://",
tier: 3
),
HostAppEntry(
bundleId: "com.evernote.iPhone.Evernote",
displayNameKey: "hostApp.evernote",
returnURLString: "evernote://",
tier: 3
),
HostAppEntry(
bundleId: "com.microsoft.onenote",
displayNameKey: "hostApp.onenote",
returnURLString: "onenote://",
tier: 3
),
HostAppEntry(
bundleId: "com.readdle.smartemail",
displayNameKey: "hostApp.spark",
returnURLString: "readdle-spark://",
tier: 3
),
HostAppEntry(
bundleId: "org.mozilla.ios.Firefox",
displayNameKey: "hostApp.firefox",
returnURLString: "firefox://",
tier: 3
),
HostAppEntry(
bundleId: "com.microsoft.msedge",
displayNameKey: "hostApp.edge",
returnURLString: "microsoft-edge://",
tier: 3
),
// Tier 4 (cont.) global / China social
HostAppEntry(
bundleId: "com.facebook.Facebook",
displayNameKey: "hostApp.facebook",
returnURLString: "fb://",
tier: 4
),
HostAppEntry(
bundleId: "com.burbn.instagram",
displayNameKey: "hostApp.instagram",
returnURLString: "instagram://",
tier: 4
),
HostAppEntry(
bundleId: "com.atebits.Tweetie2",
displayNameKey: "hostApp.x",
returnURLString: "twitter://",
tier: 4
),
HostAppEntry(
bundleId: "com.burbn.barcelona",
displayNameKey: "hostApp.threads",
returnURLString: "barcelona://",
tier: 4
),
HostAppEntry(
bundleId: "com.toyopagroup.picaboo",
displayNameKey: "hostApp.snapchat",
returnURLString: "snapchat://",
tier: 4
),
HostAppEntry(
bundleId: "com.reddit.Reddit",
displayNameKey: "hostApp.reddit",
returnURLString: "reddit://",
tier: 4
),
HostAppEntry(
bundleId: "pinterest",
displayNameKey: "hostApp.pinterest",
returnURLString: "pinterest://",
tier: 4
),
HostAppEntry(
bundleId: "com.zhihu.ios",
displayNameKey: "hostApp.zhihu",
returnURLString: "zhihu://",
tier: 4
),
HostAppEntry(
bundleId: "tv.danmaku.bili",
displayNameKey: "hostApp.bilibili",
returnURLString: "bilibili://",
tier: 4
),
HostAppEntry(
bundleId: "com.ss.iphone.ugc.Aweme",
displayNameKey: "hostApp.douyin",
returnURLString: "snssdk1128://",
tier: 4
),
HostAppEntry(
bundleId: "com.zhiliaoapp.musically",
displayNameKey: "hostApp.tiktok",
returnURLString: "tiktok://",
tier: 4
)
]