SwiftUI 与 iOS 12.x 或更老版本向后兼容吗?

如果我有一个用 SwiftUI 制作的应用程序,它能在 iOS13以下的 iOS 上工作吗?

48354 次浏览

它与 iOS13 + 兼容。

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


甚至 Xcode 10也不支持它。你需要使用 Xcode 11,这是在测试版(2019年6月3日)。 Https://developer.apple.com/tutorials/swiftui/creating-and-combining-views

不幸的是,根据苹果的文档,它只能从 iOS13开始使用。

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

没有。SwiftUI需要部署目标为 iOS 13或更高版本、 macOS 10.15或更高版本、 tvOS 13或更高版本、或 watch OS 6或更高版本。这个框架包含了许多在旧版本操作系统中不存在的新类型。

我刚刚在 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 }
}

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

此外,在 文件中,苹果明确提到了支持的版本:

  • IOS13.0 + 测试版
  • MacOS10.15 + beta
  • TvOS 13.0 + 测试版
  • Watch OS 6.0 + 测试版

enter image description here

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

如果你的目标是支持 iPhone 而不是 iPad,你可以预期大多数用户会在12-18个月内升级到 iOS13(从发布日期开始)。大概85% 到90% 吧?(我认为苹果公司说目前仍有15% 的人不使用 iOS12)这还需要一段时间,因为你不能马上部署 SwiftUI 应用程序,否则就会有疏远大量用户的风险。

同样取决于其他10-15% 是什么,这可能意味着很多用户(和 $$)为您留在桌面上。

如果你也支持 iPad,那就更加棘手了,因为人们不会经常升级他们的 iPad。现在还有很多 iPad2以及第三代和第四代的 iPad4在市面上流行,它们只有10.3.3,不能再升级了。人们只是不会起床去支付400-1000美元之间的一个新的 iPad 时,他们的工作完全罚款。

总是有更新应用程序的空间和需求,使它更好,修复 bug,这些都不一定与 iOS13有任何关系。也就是说,找到一个你以前不知道的 bug 会让很多用户不高兴。.在最新的 iOS 版本上没有。我们甚至还没有谈到许多开发商店支持的企业/公司客户。在这个领域,由于种种原因,iOS 更新受到了更多的阻碍。

所以在你对 iOS13和 SwiftUI 兴奋不已之前(你绝对应该这么做,因为它太棒了) ,回到现实世界,在硅谷之外,这并不完全符合普通消费者的期望,你需要支持老设备,因为你会疏远太多的人。

SwiftUI 合并在 Swift 5.1中使用 不透明-报税表-类别,而且由于 Opaque-Return-Types (和其他功能一起)在 Swift 5.1中实现,并且由于它们实现的性质,它们不能被重新部署到 Swift 5.0(不像 DSL财产包装纸) ,而且由于 iOS 13是最早的 iOS SDK,它在操作系统中包含 Swift 5.1运行时,所以问题的答案是否定的,而且 SwiftUI合并不能在早期版本的 iOS 上使用。

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

也许吧是向后兼容的

Swift 5.1还没有发布,而且 SwiftUI使用了诸如 不透明的返回类型< a href = “ https://github.com/apple/swift-Evolution/blob/9992cf3c11c2d5e0ea20bee98657d93902d5b174/ 提案/XXXX-function-builders.md”rel = “ noReferrer”> DSL 一个 href = “ https://github.com/apple/swift-Evolution/blob/master/ 提案/0258-property-regiates.md”rel = “ norefrer”> properties -(在 WWDC 中以 Property 包装器的形式引入)等功能,这些功能将在 Swift 5.1中提供 只有。由于 Swift 5是二进制稳定的,我猜想它不可能在 Xcode11中使用嵌入式 Swift 框架,因此他们在 Cocoa 的核心中重新实现了这些特性,并将它们标记为 iOS13 + ,直到 Swift 5.1发布。

我的假设是基于这样一个事实,即 有序收藏差异< a href = “ https://github.com/apple/swift-Evolution/blob/9992cf3c11c2d5e0ea20bee98657d93902d5b174/ 提案/XXXX-function-builders.md”rel = “ noReferrer”> DSL 将在 Swift 5.1中提供,与 Xcode 或苹果的生态系统没有关联,但它们也被标记为 @available(iOS13,...)。这意味着他们必须使用带有 iOS 可用性属性的 Swift 5.1特性来标记所有内容。一旦 Swift 5.1发布,它们中的一些将会被删除,但是我们不能确定 SwiftUICombine,除非苹果另有说法。< a href = “ https://github.com/apple/swift-Evolution/blob/9992cf3c11c2d5e0ea20bee98657d93902d5b174/ 提案/XXXX-function-builders.md”rel = “ noReferrer”> DSL 的建议中也提到了这一点:

实施: 公关。注意,Xcode 开发人员预览版中的实现使用了比这里描述的更简单的转换。链接的 公关在预览中反映了实施情况,但正在积极开发以配合这一建议。

因此,当 Swift 5.1发布时,向后不兼容限制可能会被取消,但它实际上是 需要苹果团队澄清

只适用于 ios 13或更高版本

你仍然可以使用

@available(iOS 13.0, *)

如果您仍然使用 Xcode 11以下的 Xcode 并且使用 SwiftUI 代码,则可以使用

#if canImport(SwiftUI)
...
#endif

这可以修复在使用 Xcode 11以下的 Xcode 进行编译时出现的问题

正如在我之前的所有人提到的,很明显,它需要 iOS13或更高版本。但是作为一个新的 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 项目不能同时结合情节串连板和 SwiftUI。

可惜不行,SwiftUI 只能在 iOS13及以上版本中使用。它是在 iOS13框架中引入的。在 iOS13之前,一切都是使用 Obj-C 框架(包括 Swift)构建的。

在 dev 文档的右侧,显示了 iOS、 macOS、 tvOS、 watch OS 等支持的版本。

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

希望这个能帮上忙!

创建两个情节串连板,一个使用 UIKit,另一个使用 UIHostingController 和 SwiftUI。

然后使用 如果 # 可用()检查操作系统是否支持 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)


}