Bug Report: Unrecognized selector sent to CPTemplateApplicationScene (CarPlay) — iOS 27
Summary
The Intercom iOS SDK crashes the host app with an **unrecognized selector** exception when a
CarPlay scene is involved in scene lifecycle. Intercom sends a `UIWindowScene`-only selector to
`CPTemplateApplicationScene`, which is a sibling of `UIWindowScene`, not a subclass — so the
message is unhandled and the app terminates.
This is the same long-standing defect previously reported as
`-[CPTemplateApplicationScene windows]: unrecognized selector`
(
and
)
On **iOS 27** the selector has changed to a different `UIWindowScene`-only API:
-[CPTemplateApplicationScene _enhancedWindowingEnabled]: unrecognized selector sent to instance
Environment
Intercom SDK | 19.3.2 (intercom-ios-sp, SPM). Also reproduces on latest 19.6.3 — updating does not fix it.
iOS 27 (also historically reproduced on earlier iOS with the `windows` selector variant)
SwiftUI/UIKit app with a separate CarPlay scene (`CPTemplateApplicationSceneDelegate`)
`Intercom.setApiKey(_:forAppId:)` in `application(_:didFinishLaunchingWithOptions:)`
Crash signature
-[CPTemplateApplicationScene _enhancedWindowingEnabled]: unrecognized selector sent to instance
Captured via Bugsnag in production, unhandled.
Root cause (our analysis)
1. Intercom is initialized at app launch and subscribes to scene lifecycle notifications globally,
before any scene has connected.
2. When a scene enters the foreground, Intercom's presentation manager
(`ICMPresentationManager` `sceneWillEnterForeground:`) attempts to create its Messenger window in
whatever scene is entering foreground via `createIntercomWindowInScene:` →
`-[UIWindow setWindowScene:]`.
3. Somewhere in that window-attachment path, a `UIWindowScene`-only selector is queried on the
scene. When the scene is the **CarPlay** `CPTemplateApplicationScene`, that selector is
unimplemented and the app crashes.
The defect is that Intercom assumes every foregrounding scene is a normal app `UIWindowScene` it can
attach a window to. It does not guard against non-`UIWindowScene` scene types such as
`CPTemplateApplicationScene`.
Reproduction
1. Initialize Intercom at launch in `application(_:didFinishLaunchingWithOptions:)`.
2. Add a CarPlay scene (`CPTemplateApplicationSceneDelegate`) to the app.
3. Connect to CarPlay (head unit or the CarPlay simulator), particularly while a foreground
notification can fire / while the CarPlay scene transitions to foreground.
4. The app crashes with the unrecognized-selector exception above.
Expected behavior
Intercom should only ever create/attach its Messenger window to a `UIWindowScene`. It should
ignore scenes whose class is not a `UIWindowScene` (e.g. `CPTemplateApplicationScene`), or expose a
public API to scope its presentation to a specific app `UIWindowScene`.
Current workaround (on our side)
We shim the missing selectors on `CPTemplateApplicationScene` so the message resolves to a no-op
instead of crashing:
extension CPTemplateApplicationScene {
@objc var windows: UIWindow? { nil } // older selector variant
@objc var _enhancedWindowingEnabled: Bool { false } // iOS 27 selector variant
}
This relies on private selector names and guesses at the contract, so it is a stopgap, NOT a fix.
Each new iOS release that changes the queried selector breaks us again until we add another shim.
Requests
1. Add a scene-type guard so Intercom never attempts window attachment on a non-`UIWindowScene`.
2. Please add us to the existing internal issue tracking this; it has been acknowledged by Intercom
support previously but appears unresolved across the 19.x line.