Apps that use canOpenURL to check which other apps are installed — for deep-link routing, cross-promotion, or “open in app” prompts — have relied on declaring up to 50 custom URL schemes in LSApplicationQueriesSchemes. For apps linked against iOS 27, that ceiling drops to 25. Any scheme past the 25th entry falls outside the documented limit, and Apple’s failure mode for an undeclared scheme is a plain false — indistinguishable from “app not installed.” A feature that quietly stops working is worse than one that never worked, because nothing throws an error and no one notices until conversion numbers start drifting.
That makes this a tracking problem before it’s a code problem. Teams that don’t already log which schemes they’re checking, and what canOpenURL returns for each, have no way to tell a real “not installed” from a silently truncated query. If deferred deep linking, referral attribution, or a partner cross-app flow depends on detecting an installed app, this change can degrade that detection without a single crash or exception to flag it — the numbers just get quietly worse.
Data Points to Track
- Scheme declaration count, logged at build time, for every target’s
LSApplicationQueriesSchemesarray — flag anything approaching or exceeding 25 before it ships to an iOS 27-linked build - Per-scheme query outcome, recording which scheme was checked and whether
canOpenURLreturnedtrueorfalse, so a spike infalseresults can be traced to a specific scheme rather than read as a blanket “app not installed” signal - Query order and priority, since only the first 25 declared schemes are guaranteed to resolve correctly — track which schemes are being silently dropped by declaration order
- Universal link fallback usage, comparing how often a flow falls back to a universal link versus a custom scheme check, to quantify how much detection is shifting to the recommended alternative
- Attribution match rate by referral source, segmented before and after the iOS 27 rollout, to catch a drop caused by this limit rather than a genuine falloff in referral traffic
Setup Steps
- Audit every
Info.plistacross your app’s targets and count declared schemes inLSApplicationQueriesSchemes— anything over 25 needs prioritisation before an iOS 27 build ships. - Rank schemes by actual query volume, not by how the list was originally assembled, and keep only the 25 most-queried in the primary declaration.
- Migrate installed-app detection to universal links where possible, using
open(_:options:completionHandler:)withuniversalLinksOnlyinstead of a custom-schemecanOpenURLcheck. - Instrument every
canOpenURLcall site to log the scheme and result, not just a boolean used internally, so a regression is traceable to a specific integration. - Add an automated build-time check that fails CI if a target’s scheme count exceeds 25, so this doesn’t silently regress again after a partner integration is added later.
Actionable Insights
Treat the 25-scheme ceiling as a forcing function to move installed-app detection onto universal links wherever a partner or platform supports them, rather than patching the custom-scheme list indefinitely. For schemes that have no universal-link alternative — genuinely custom third-party integrations — the per-scheme query logging above is what turns a silent regression into a visible, debuggable one. Without it, a drop in cross-app attribution after an iOS 27 rollout looks identical to a real decline in referral traffic, and teams can spend weeks chasing the wrong cause.
Related Resources
Need help tracking this in your app?
Our team sets up analytics pipelines for mobile and web teams every day. Talk to us and get your first events flowing in under an hour.
Talk to an expert