Your support page, your terms, your patch notes. Today Unity has one way to show any of them, and it
is the one a game does not want: `Application.OpenURL` pushes your app to the background and brings
Safari or Chrome forward as a separate app. On a mid-range Android device coming back can mean an
app restart. Even when it does not, the music stops, the session breaks, and a two-line privacy
policy costs the player their place in the game.
This package opens the same page in a sheet that slides up over the running game.
WHAT YOU GET
• One line of code: Browser.Open("https://example.com/support")
• iOS uses SFSafariViewController presented as a modal inside your own app. The process is never
backgrounded, OnApplicationPause is never raised, audio keeps playing and the game loop keeps
running behind the sheet
• Android uses a Chrome Custom Tab, shown as a partial sheet where the platform supports it
• Real browser behaviour you do not have to maintain: cookies, saved passwords, reader mode, share,
and the address bar that shows the player which site they are actually on
THE SHEET IS YOURS TO SHAPE
• Height as a fraction of the screen, from a third of the screen up to full screen
• Draggable up to full screen, or fixed where you set it
• Toolbar colour and text colour, page title on or off, share button on or off
• iOS dismiss wording: Done, Close or Cancel
• Bar collapsing while the user scrolls, and an isolated no-cookie session when you need one
EVENTS AND STATE
• OnOpened, OnClosed and OnFailed, all raised on the Unity main thread
• Browser.IsOpen so your own pause handling can tell the browser sheet apart from the player
leaving, and Browser.IsSupported so you know what the device can do before you ask
• Browser.Prewarm to warm the browser process before the player taps
HONEST ABOUT THE PLATFORMS
On iOS the sheet is a modal inside your app and nothing pauses. On Android a Custom Tab is a
separate Activity in the same task, so a full-screen tab does raise OnApplicationPause. The package
says so, gives you the flag to handle it, and the read-me carries the table. The partial sheet needs
Android 12L and Chrome 107 or newer, and drops to full screen in landscape and in multi-window on
every version. That is platform behaviour, not a bug, and the code accepts it silently instead of
pretending otherwise.
CLEAN AND SAFE
• No Unity package dependencies. The Android backend is gated on the Android JNI module and
compiles without it
• Namespaced code (Krykftn.QuickInAppBrowser) in its own assemblies, editor code editor-only
• The Android package visibility entry ships in the plugin's own manifest, so the Custom Tabs
service is actually found on Android 11 and newer
• SafariServices.framework is linked by a post-process build step, so iOS needs no setup at all
• Editor, desktop and WebGL compile and run, falling back to Application.OpenURL
REQUIREMENTS
• Unity 2022.3 LTS or newer
• iOS 13+, Android 5.0+ (API 21)
• Android needs androidx.browser 1.8.0. There is an External Dependency Manager manifest for projects that
have EDM4U, and a one-line manual alternative for projects that do not
HONEST LIMITS
The partial sheet is a request, not a guarantee: below Android 12L, below Chrome 107, in landscape
and in multi-window the same call opens a full-screen tab. On iOS 13 and 14 there are no detents, so
the height ratio is ignored and the system page sheet height is used. Prewarm is an Android-only
API and is a no-op on iOS rather than a lie.