Issue #984

The WidgetBundle lets us expose multiple widgets from a single widget extension

It uses WidgetBundleBuilder to constructs a widget bundle’s body.

In iOS 18, if we include ControlWidget then we need to check iOSApplicationExtension iOS 18. For now in Xcode 16 there’s a bug that prevents existing widgets from appearing in iOS 17.

We can leverage WidgetBundleBuilder to conditionally render widgets for each iOS version

import SwiftUI
import WidgetKit
import Widgets

@main
struct OurAppWidgetBundle: WidgetBundle {
    var body: some Widget {
        if #available(iOSApplicationExtension 18.0, *) {
            return iOS18Widgets
        } else {
            return iOS17Widgets
        }
    }

    @available(iOSApplicationExtension 18.0, *)
    @WidgetBundleBuilder
    private var iOS18Widgets: some Widget {
        BookingsWidget()
        TransactionsWidget()
        BookControlWidget()
        RefundControlWidget()
    }

    @WidgetBundleBuilder
    private var iOS17Widgets: some Widget {
        BookingsWidget()
        TransactionsWidget()
    }
}