You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift Widget开发:如何仅让锁屏组件对iOS16用户可用

WidgetBundle 分版本兼容实现方案

问题原因

直接给@main标记的Widgets结构体添加@available(iOSApplicationExtension 16.0, *)标记的方案不可行,是因为这个结构体是整个小组件扩展的加载入口,一旦给入口加上高版本限制,低版本iOS会直接判定整个小组件扩展不兼容,完全不加载任何内部组件,最终导致iOS14-15用户无法使用原有主屏小组件。

实现思路

不要给WidgetBundle入口结构体加全局高版本限制,只做两层控制:

  • 给两个锁屏专属小组件本身添加iOS16及以上的版本可用标记
  • 在WidgetBundle的组件构建闭包内做系统版本判断,仅在iOS16+环境下把锁屏组件加入加载列表

具体修改步骤

  • 标记锁屏组件的版本限制
    找到两个锁屏组件的定义位置,给对应的结构体加上版本标记,示例:

    @available(iOSApplicationExtension 16.0, *)
    struct LockscreenWidget1: Widget {
        // 保留LockscreenWidget1原有实现代码
    }
    
    @available(iOSApplicationExtension 16.0, *)
    struct LockscreenWidget2: Widget {
        // 保留LockscreenWidget2原有实现代码
    }
    
  • 修改WidgetBundle入口代码
    移除入口结构体上注释掉的全局@available标记,在body闭包内加入版本判断逻辑,修改后的完整入口代码如下:

    import WidgetKit
    import SwiftUI
    
    @main
    struct Widgets: WidgetBundle {
        @WidgetBundleBuilder
        var body: some Widget {
            // 三个主屏组件全版本兼容,iOS14-15可正常加载
            Widget1()
            Widget2()
            Widget3()
            
            // 仅iOS16及以上系统加载锁屏组件
            if #available(iOSApplicationExtension 16.0, *) {
                LockscreenWidget1()
                LockscreenWidget2()
            }
        }
    }
    

最终效果

  • iOS14、iOS15系统用户:仅可见3个原有主屏小组件,完全不受新增锁屏组件影响,使用逻辑和之前完全一致
  • iOS16及以上系统用户:可见全部5个小组件,可正常添加使用两个锁屏专属组件

说明:@WidgetBundleBuilder原生支持if #available条件分支语法,无需自定义额外的构建器逻辑,该方案适配Xcode 14及以上开发环境(开发iOS16锁屏组件本身就要求Xcode14+,无额外兼容问题)

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:54:20