Search code examples
swiftuiwidgetkitios17

is there a way to provide iOS version check inside widget extension


I tried to add iOS 17 version check inside WidgetBundle but the widget extension keep on crashing .

Getting Thread 1: Swift runtime failure: Unexpectedly found nil while unwrapping an Optional value. After removing the iOS 17 check it works fine.

Is there any way to provide version check inside widgetBundle?

 struct MyWidgets: WidgetBundle {
        @WidgetBundleBuilder
        var body: some Widget {
            widget1()
            widget2()

            if #available(iOSApplicationExtension 16.1, *) {
               LiveActivity()
            }
            if #available(iOSApplicationExtension 17.0, *) {
               ContactdWidget()
            }
            
        }
}

Solution

  • Try WidgetBundleBuilder.buildBlock for every separate version check and provide all supported widgets inside buildBlock for a particular version

    struct MyWidgets: WidgetBundle {
    
        @WidgetBundleBuilder
        var body: some Widget {
            getWidgets()
        }
    
        private func getWidgets()-> some Widget{
            if #available(iOS 16.1, *){
              return getNewiOSWidgets()
            }else{
                //Older widgets
            }
        }
    
        @available(iOSApplicationExtension 16.1, *)
        private func getNewiOSWidgets()->some Widget{
            if #available(iOS 17.0, *) {
                return WidgetBundleBuilder.buildBlock(
                   Widget1(),
                    Widget2(),
                    LiveActivityWidget()
                )
            }else{
                return WidgetBundleBuilder.buildBlock(
                    Widget3(),
                    Widget4(),
                    LiveActivityWidget()
                )
            }
            
        }
    }