如果我有一个使用 SwiftUI 制作的应用程序,它是否适用于 iOS 13 以下的 iOS?
12 回答
我刚刚在 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 }
}
SwiftUI和Combine在 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运行时,所以这个问题的答案是否定的,SwiftUI和Combine不能在早期版本的 iOS 上使用。
除非,Apple 提供了一种将Swift 5.1运行时(或未来版本)与应用程序捆绑的方法,就像它过去与早期 Swift 版本一样,但由于它会增加应用程序大小并再次增加整个系统的开销,我怀疑这会曾经发生过。
它可能向后兼容
Swift 5.1 尚未发布,SwiftUI
它使用了诸如opaque return types、DSL、propertyDelegate(在 WWDC 中作为propertyWrapper引入)等功能,这些功能仅在 Swift 5.1 中可用。由于 Swift 5 是二进制稳定的,我猜不可能在 Xcode11 中使用嵌入式 swift-frameworks,因此他们在 Cocoa 的核心中重新实现了这些功能,并将它们标记为 iOS13+ 可用,直到 Swift 5.1 发布。
我的假设基于这样一个事实,即Ordered Collection Diffing和DSL将在 Swift 5.1 中可用,并且与 Xcode 或 Apple 的生态系统没有关联,但它们也被标记为@available(iOS13,...)
. 这意味着他们必须使用带有 iOS 可用性属性的 Swift 5.1 功能来标记所有内容。一旦 Swift 5.1 发布,其中一些将被删除,但我们无法确定SwiftUI
,Combine
除非 Apple 另有说明。DSL的提案中也提到了这一点:
实施:公关。请注意,Xcode 开发者预览版中的实现使用了比这里描述的更简单的转换。链接的PR反映了预览中的实施,但正在积极开发以匹配此提案。
因此,当 Swift 5.1 发布时,向后不兼容的限制可能会被取消,但确实需要 Apple 团队来澄清。
我不这么认为,因为所有库都已针对 iOS 13 或更高版本进行了注释。
此外,在文档中,Apple 明确提到了支持的版本:
- iOS13.0+ 测试版
- macOS10.15+ 测试版
- tvOS 13.0+ 测试版
- watchOS 6.0+ 测试版
不可以。SwiftUI需要iOS 13 或更高版本、macOS 10.15 或更高版本、tvOS 13 或更高版本或 watchOS 6 或更高版本的部署目标。该框架包含许多旧版本操作系统中不存在的新类型。
如果您打算支持 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(您绝对应该因为它很棒)感到兴奋之前,回到硅谷以外的现实世界,这与普通消费者的期望并不完全一致,您需要支持旧设备并且需要,因为您会疏远太多人。
它与 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
不幸的是,根据 Apple 文档,它仅从 iOS 13 开始可用。
仅适用于 ios 13 或更高版本
您仍然可以SwiftUI
使用附加代码
@available(iOS 13.0, *)
如果您仍在使用 Xcode 11 以下的 Xcode 并拥有 SwiftUI 代码,则可以将其包装为
#if canImport(SwiftUI)
...
#endif
这可以解决使用低于 Xcode 11 的 Xcode 编译时的问题
正如大家所说,它不会向后兼容旧的 iOS 版本。但鉴于苹果公司最新 iOS 的安装基数一直很高,而且 iOS 13 需要 iPhone 6S 或更高版本、iPad Air 2 或更高版本、新的 iPad mini 4 和 iPhone SE。绝大多数用户将能够安装 iOS 13 并享受可爱的 SwiftUI 应用程序。
遗憾的是,SwiftUI 仅在 iOS 13 及更高版本中允许使用。它是在 iOS 13 框架中引入的。在 iOS 13 之前,一切都是使用 Obj-C 框架(包括 Swift)构建的。
在开发文档的右侧,显示了支持的 iOS、macOS、tvOS、watchOS 等版本。
https://developer.apple.com/documentation/swiftui/
希望这可以帮助!
正如我之前的所有人所提到的,很明显它需要 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。
创建两个故事板,一个使用 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)
}