145

如果我有一个使用 SwiftUI 制作的应用程序,它是否适用于 iOS 13 以下的 iOS?

4

12 回答 12

105

我刚刚在 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 }
}
于 2019-06-03T20:05:15.060 回答
36

SwiftUICombine在 Swift 5.1 中使用Opaque-Return-Types,并且由于 Opaque-Return-Types(以及其他功能)在 Swift 5.1 中实现,并且由于其实现的性质,它们不能回部署到Swift 5.0(与DSL不同或Property-Wrappers),并且因为 iOS 13 是最早的 iOS SDK,在 OS 中包含Swift 5.1运行时,所以这个问题的答案是否定的,SwiftUICombine不能在早期版本的 iOS 上使用。

除非,Apple 提供了一种将Swift 5.1运行时(或未来版本)与应用程序捆绑的方法,就像它过去与早期 Swift 版本一样,但由于它会增加应用程序大小并再次增加整个系统的开销,我怀疑这会曾经发生过。

可能向后兼容

Swift 5.1 尚未发布,SwiftUI它使用了诸如opaque return typesDSLpropertyDelegate(在 WWDC 中作为propertyWrapper引入)等功能,这些功能在 Swift 5.1 中可用。由于 Swift 5 是二进制稳定的,我猜不可能在 Xcode11 中使用嵌入式 swift-frameworks,因此他们在 Cocoa 的核心中重新实现了这些功能,并将它们标记为 iOS13+ 可用,直到 Swift 5.1 发布。

我的假设基于这样一个事实,即Ordered Collection DiffingDSL将在 Swift 5.1 中可用,并且与 Xcode 或 Apple 的生态系统没有关联,但它们也被标记为@available(iOS13,...). 这意味着他们必须使用带有 iOS 可用性属性的 Swift 5.1 功能来标记所有内容。一旦 Swift 5.1 发布,其中一些将被删除,但我们无法确定SwiftUICombine除非 Apple 另有说明。DSL的提案中也提到了这一点:

实施:公关。请注意,Xcode 开发者预览版中的实现使用了比这里描述的更简单的转换。链接的PR反映了预览中的实施,但正在积极开发以匹配此提案。

因此,当 Swift 5.1 发布时,向后不兼容的限制可能会被取消,但确实需要 Apple 团队来澄清

于 2019-06-11T21:32:55.767 回答
34

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

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

  • iOS13.0+ 测试版
  • macOS10.15+ 测试版
  • tvOS 13.0+ 测试版
  • watchOS 6.0+ 测试版

在此处输入图像描述

于 2019-06-04T05:43:56.857 回答
17

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

于 2019-06-03T19:58:50.297 回答
14

如果您打算支持 iPhone 而不是 iPad,您可能预计大多数用户将在 12-18 个月内(​​从发布日期开始)升级到 iOS 13。也许是 85-90%?(我认为 Apple 表示此时仍有 15% 的人未使用 iOS 12)尽管您无法立即部署 SwiftUI 应用程序,否则还有可能疏远很多用户,这还有很长一段时间。

此外,取决于其他 10-15% 是多少,这可能意味着您的很多用户(和 $$)留在了桌面上。

如果您也支持 iPad,那就更棘手了,因为人们不会经常升级他们的 iPad。有很多 iPad 2s 以及第 3 代和第 4 代 iPad 仍然存在,只有 10.3.3 并且无法再升级。当他们的 iPad 运行良好时,人们不会起床并花 400 到 1,000 美元购买新 iPad。

总是有空间和需要更新应用程序,使其更好,修复错误,这不一定与 iOS 13 有任何关系。即找到一个你之前不知道的错误,这会让很多用户不满意。 . 不在最新的 iOS 版本上。我们甚至还没有谈论很多开发商店支持的企业/企业客户。由于该领域的各种原因,iOS 更新存在更多阻力。

因此,在您对 iOS 13 和 SwiftUI(您绝对应该因为它很棒)感到兴奋之前,回到硅谷以外的现实世界,这与普通消费者的期望并不完全一致,您需要支持旧设备并且需要,因为您会疏远太多人。

于 2019-06-06T17:38:15.750 回答
10

它与 iOS 13+ 兼容。这是其文档的链接。

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


甚至 Xcode 10 也不支持它。您需要使用截至(2019 年 6 月 3 日)处于测试阶段的 Xcode 11。 https://developer.apple.com/tutorials/swiftui/creating-and-combining-views

于 2019-06-03T19:40:35.190 回答
9

不幸的是,根据 Apple 文档,它仅从 iOS 13 开始可用。

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

于 2019-06-03T19:57:50.607 回答
9

仅适用于 ios 13 或更高版本

您仍然可以SwiftUI使用附加代码

@available(iOS 13.0, *)

如果您仍在使用 Xcode 11 以下的 Xcode 并拥有 SwiftUI 代码,则可以将其包装为

#if canImport(SwiftUI)
...
#endif

这可以解决使用低于 Xcode 11 的 Xcode 编译时的问题

于 2019-07-24T04:23:46.430 回答
5

正如大家所说,它不会向后兼容旧的 iOS 版本。但鉴于苹果公司最新 iOS 的安装基数一直很高,而且 iOS 13 需要 iPhone 6S 或更高版本、iPad Air 2 或更高版本、新的 iPad mini 4 和 iPhone SE。绝大多数用户将能够安装 iOS 13 并享受可爱的 SwiftUI 应用程序。

于 2019-06-04T17:46:19.800 回答
4

遗憾的是,SwiftUI 仅在 iOS 13 及更高版本中允许使用。它是在 iOS 13 框架中引入的。在 iOS 13 之前,一切都是使用 Obj-C 框架(包括 Swift)构建的。

在开发文档的右侧,显示了支持的 iOS、macOS、tvOS、watchOS 等版本。

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

希望这可以帮助!

于 2020-06-15T06:44:35.550 回答
3

正如我之前的所有人所提到的,很明显它需要 iOS 13 或更高版本。但作为一个新的 iOS 开发者,我很担心与 UIKit 相比,我应该在多大程度上采用 SwiftUI。我已经用 UIKit 构建了一些小项目,并用它进行了一些改进。

但是随着 SwiftUI 的开始,它们之间如何结合。以下链接中的文章将所有内容置于上下文中: https ://www.hackingwithswift.com/quick-start/swiftui/answering-the-big-question-should-you-learn-swiftui-uikit-or-both

我现在唯一担心的是,我注意到 Xcode 11 中的 Xcode 项目不能同时结合 Storyboard 和 SwiftUI。

于 2019-11-27T18:01:48.663 回答
2

创建两个故事板,一个使用 UIKit,另一个使用 UIHostingController 和 SwiftUI。

然后使用if #available()检查操作系统是否支持 SwiftUI。

    // SwiftUI
    
    let storyboard_swiftUI = UIStoryboard(name: "Main-SwiftUI", bundle: nil)
    let controller_swiftUI = storyboard_swiftUI.instantiateViewController(withIdentifier: "ViewControllerSwiftUI")

    // UIKit
    
    let storyboard_UIKit = UIStoryboard(name: "Main-UIKit", bundle: nil)
    let controller_UIKit = storyboard_UIKit.instantiateViewController(withIdentifier: "ViewControllerUIKit")

    if #available(macCatalyst 14.0, iOS 14.0, *){

        // SwiftUI

        self.present(controller_swiftUI, animated: true)

    } else {
        
        // UIKit
        
        self.present(controller_UIKit, animated: true)

    }
于 2021-09-03T00:57:19.003 回答