锁屏快捷小部件只适用于 iOS 16 用户。

5

我有多个小部件是为iOS 14及以上的用户设计的,但是由于新的锁屏小部件,只能在iOS 16及以上版本中使用。如何只让底部两个小部件适用于iOS 16用户?如果取消顶部行的注释,那么我认为所有小部件都只能适用于iOS 16及以上版本,但我不能这样做,因为我希望我的用户在使用iOS 14-15时仍然可以继续使用主屏幕小部件。

import WidgetKit
import SwiftUI


//@available(iOSApplicationExtension 16.0, *)
@main
struct Widgets: WidgetBundle {
    @WidgetBundleBuilder
    var body: some Widget {
        Widget1()
        Widget2()
        Widget3()
        LockscreenWidget1()
        LockscreenWidget2()
    }
}

这个回答解决了你的问题吗?在Swift中检查操作系统版本? - pkamb
@pkamb 我希望能这样做,但我已经尝试过了。请看下面答案的评论。当我尝试那样做时,就会出现这个错误信息。 - Mark
1
如何添加一个锁屏小部件,要求iOS 16及以上版本,并仍然支持iOS 15? - lewis
如何为仅锁屏小部件添加新目标?您可以指定 iOS 16 及以上的部署目标。我还没有尝试过。 - sekitaka
2个回答

9

您需要在小部件逻辑中进行配置。

例如:

@main
struct MyWidget: Widget {
    
    private let supportedFamilies: [WidgetFamily] = {
        if #available(iOSApplicationExtension 16.0, *) {
            return [.systemSmall, .systemMedium, .systemLarge, .systemExtraLarge, .accessoryInline, .accessoryCircular, .accessoryRectangular]
        } else if #available(iOSApplicationExtension 15.0, *) {
            return [.systemSmall, .systemMedium, .systemLarge, .systemExtraLarge]
        } else {
            return [.systemSmall, .systemMedium, .systemLarge]
        }
    }()
    
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            MyWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("Demo Name")
        .description("Description of the demo.")
        .supportedFamilies(supportedFamilies)
    }
}

0
var body: some Widget {
    widgets()
}

func widgets() -> some Widget {
    if #available(iOS 16.0, *) {
        return WidgetBundleBuilder.buildBlock(LockscreenWidget1(), Widget1())
    } else {
        return Widget1()
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接