Skip to content

CarPlay blocks the NotificationBanner #421

@Anf139

Description

@Anf139

I have the iOS application with CarPlay support. I don't see the NotificationBanner during CarPlay on the iPhone's display or CarPlay's display.

Because of bannerPositionFrame is nil here:

func show(
        placeOnQueue: Bool,
        queuePosition: QueuePosition = .back,
        bannerPosition: BannerPosition = .top
    )

guard bannerPositionFrame != nil else {
    remove();
    return
}

I investigated a little bit and found the next call stack where appWindow is nil:

internal func updateBannerPositionFrames() {
    guard let window = appWindow else { return }
    bannerPositionFrame = BannerPositionFrame(
/// The main window of the application which banner views are placed on
private let appWindow: UIWindow? = {
    if #available(iOS 13.0, *) {
        return UIApplication.shared.connectedScenes
            .first { $0.activationState == .foregroundActive || $0.activationState == .foregroundInactive }
            .map { $0 as? UIWindowScene }
            .flatMap { $0?.windows.first } ?? UIApplication.shared.delegate?.window ?? UIApplication.shared.keyWindow
    }

    return UIApplication.shared.delegate?.window ?? nil
}()

During CarPlay usage the connectedScenes can contain

<CPTemplateApplicationScene: 0x10a556f50; role: CPTemplateApplicationSceneSessionRoleApplication; activationState: UISceneActivationStateForegroundActive>
<UIWindowScene: 0x10a434c40; role: UIWindowSceneSessionRoleApplication; activationState: UISceneActivationStateForegroundActive>

I propose to use something like this:

var appWindow: UIWindow? {
    let scenes: [UIScene] = Array(UIApplication.shared.connectedScenes)
    let windowScenes: [UIWindowScene] = scenes.compactMap { $0 as? UIWindowScene } // avoid CarPlay CPTemplateApplicationScene
    let foregroundScene: UIWindowScene? = windowScenes.first { $0.activationState == .foregroundActive || $0.activationState == .foregroundInactive }
    return foregroundScene?.windows.first
}

To avoid usage of type CPTemplateApplicationScene which cannot be converted to UIWindowScene.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions