SwiftUI是否向下兼容iOS 12.x及更早版本?

153

如果我使用SwiftUI创建了一个应用程序,它能在低于iOS 13的iOS设备上运行吗?


1
大家知道为什么我的回答被@Jean-François Fabre删除了吗? - CrazyPro007
12
不,SwiftUI 不支持 iOS 12.x 及更早版本。 - ystack
12个回答

108

我刚在Xcode 11中检查了一下,并确认它不会向后兼容,因为可以在SwiftUI的View实现中看到:

我刚在 Xcode 11 中进行了验证,确认它不会向后兼容,因为在 SwiftUI 的 View 实现中可见。

/// A piece of user interface.
///
/// You create custom views by declaring types that conform to the `View`
/// protocol. Implement the required `body` property to provide the content
/// and behavior for your custom view.
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
public protocol View : _View {

    /// The type of view representing the body of this view.
    ///
    /// When you create a custom view, Swift infers this type from your
    /// implementation of the required `body` property.
    associatedtype Body : View

    /// Declares the content and behavior of this view.
    var body: Self.Body { get }
}

7
还需要至少5年?所以你现在只使用iOS 7及以下版本可用的API? - David Monagle
6
最奇怪的是,你可以在Mojave(10.4)上使用Xcode 11制作一个SwiftUI应用程序,但它只能在Catalina(10.5)上运行。 - Túlio Calazans

39

SwiftUICombine使用Swift 5.1Opaque-Return-Types。由于该特性是在Swift 5.1中实现的,且无法像DSLProperty-Wrappers那样回退到Swift 5.0,因此不能在早期版本的iOS上使用SwiftUICombine,因为iOS 13是包含Swift 5.1运行时的最早版本。

除非苹果提供了一种将Swift 5.1运行时(或未来版本)与应用程序捆绑在一起的方式,就像它以前使用早期的Swift版本一样。但因为这会增加应用程序大小并对整个系统增加额外开销,所以我怀疑这将永远不会发生。

可能具有向后兼容性

Swift 5.1尚未发布,SwiftUI使用了一些特性,例如不透明返回类型DSLpropertyDelegate(在WWDC中作为propertyWrapper引入)等,这些特性仅在Swift 5.1中可用。由于Swift 5是二进制稳定的,我猜想在Xcode11中无法使用嵌入式swift-frameworks,因此他们已经重新实现了这些功能,并将它们标记为iOS13+可用,直到Swift 5.1发布。
我的假设基于这样一个事实: 有序集合差异比较领域特定语言将在Swift 5.1中提供,并且与Xcode或苹果生态系统没有任何关联,但它们也被标记为@available(iOS13, ...)。这意味着他们必须使用iOS可用性属性来标记使用Swift 5.1功能的所有内容。其中一些将在Swift 5.1发布后被删除,但我们不能确定SwiftUICombine是否会被删除,除非苹果另有说明。这也在领域特定语言的提案中提到:

实现:PR。请注意,Xcode开发人员预览版中的实现与此处描述的实现略有不同。链接的PR反映了预览版中的实现,但正在积极开发以匹配此提案。

当 Swift 5.1 发布时,向后不兼容的限制可能会被解除,但真正需要由 Apple 团队澄清。


1
这个有更新了吗?你提到的 PR 已经合并了,Swift 5.1 已经发布。 - user158
1
@user158,我刚刚更新了答案并解释了为什么无法支持此功能。 - farzadshbfn

35

我不这么认为,因为所有的库都已经为iOS 13或更高版本进行了注释。

此外,在文档中,Apple明确提到支持的版本:

  • iOS13.0+ beta
  • macOS10.15+ beta
  • tvOS 13.0+ beta
  • watchOS 6.0+ beta

输入图像描述


17

苹果的SwiftUI需要部署到iOS 13或更高版本、macOS 10.15或更高版本、tvOS 13或更高版本或watchOS 6或更高版本。该框架包含许多在旧版操作系统上不存在的新类型。


可以在支持更低的部署目标的情况下,在iOS 13上使用SwiftUI。请查看https://dev59.com/WbTma4cB1Zd3GeqP41iq#58372597。 - Renatus

14

如果你想支持 iPhone 而不是 iPad,那么你可以预计大多数用户在 12-18 个月内(从发布日期开始)升级到 iOS 13。也许是85-90%?(我认为,目前苹果公司表示还有15%的人没有使用 iOS 12)。尽管如此,在这段时间里,您仍将无法立即部署 SwiftUI 应用程序,否则会冒着疏远很多用户的风险。

此外,取决于剩下的10-15%是什么,这可能意味着您能够获得留给你的许多用户和收益。

如果你也支持iPad,那么情况会更加复杂,因为人们不会经常升级他们的iPad。还有很多iPad 2以及第三代和第四代iPad仍然存在,它们只有10.3.3版本,无法再升级了。当他们的设备完全正常时,人们不会花费 $400 到 $1,000 购买一个新的iPad。

总有更新应用程序、改进应用程序和修复错误等需求,这些需求不一定与iOS 13有任何关系。例如,发现之前不知道的 bug,使得许多用户不高兴,而这些用户未必都使用最新的iOS版本。我们甚至还没有谈到很多开发商支持的企业/公司客户,这些客户对于iOS更新有各种各样的反对意见。

因此,在你对iOS 13和SwiftUI感到非常兴奋之前(你应该这样做,因为它真的很棒),在硅谷以外的现实世界中,这并不完全符合普通消费者的期望。你需要支持旧设备,因为你会排斥太多人。


1
我认识很多使用“不受支持”的iPhone的人,因此您永远无法达到最新iOS版本的100%覆盖率。当我的当前手机失效时,我知道我会仔细考虑我的下一部手机。 - Gavin
@cspam 虽然你的假设可能是正确的,但它们并没有回答这个问题。 - user1892364
iOS 12没有放弃超过10%的设备支持,因此很难说我们是否可以期望iOS 13有同样的采用率。 - Casper Zandbergen
SwiftUI 需�支�旧设备并且必须这样�,因为有太多的人会被�除在外�� - Trevor
1
截至2021年,90%的苹果用户使用13+版本。 - Petro

10

9

所有链接的文档都只是说您需要使用iOS 13 SDK(即Xcode 11)。这并不意味着设备的最低支持iOS版本必须是iOS 13...您可以很好地支持旧版iOS版本... - scaly

9

只能在iOS 13或更高版本中使用

您仍然可以通过以下方式附加您的SwiftUI代码:

@available(iOS 13.0, *)

如果您仍在使用低于 Xcode 11 版本的 Xcode 并且拥有 SwiftUI 代码,您可以将其包装在```<#if canImport(SwiftUI)```中。
#if canImport(SwiftUI)
...
#endif

这可以解决使用Xcode 11以下版本编译时的问题。

5

众所周知,它将不向旧版iOS版本兼容。但考虑到苹果始终拥有最新iOS的高安装率,以及iOS 13需要iPhone 6S或更高版本,iPad Air 2或更高版本,新款iPad mini 4和iPhone SE。绝大多数用户都能够安装iOS 13并享受美妙的SwiftUI应用。


3
我的 iPad 不符合 iOS 13 的要求,但它仍然表现良好,而且我希望不用很快更换它。我希望那些我喜欢或需要的应用程序不会抛弃老设备。 - Gavin

4
很遗憾,SwiftUI仅适用于iOS 13及以上版本。它是在iOS 13框架中引入的。在iOS 13之前,所有内容都是使用Obj-C框架构建的(包括Swift)。 在开发文档的右侧,显示支持的iOS、macOS、tvOS、watchOS等版本。

https://developer.apple.com/documentation/swiftui/

希望这能帮到你!

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