我已经通过以下方法创建了一个兼容 iOS 13 的 SwiftUI 项目。这对于 iOS 13 有一个块,对于 iOS 14+ 有另一个块
第 0 步:使用 XCode 创建 SwiftUI 项目
这将有一个主 swift 文件和一个 ContentView.swift。
// ContentView.swift
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
第1步:更新Info.plist如下。
第 2 步:使用以下代码更新主 swift 文件。
import UIKit
import SwiftUI
@main
struct MainApp {
static func main() {
if #available(iOS 14.0, *) {
MyView.main()
} else {
UIApplicationMain(
CommandLine.argc,
CommandLine.unsafeArgv,
nil,
NSStringFromClass(AppDelegate.self))
}
}
}
@available(iOS 14.0, *)
struct MyView: App {
var body: some Scene {
WindowGroup {
ContentView() // Add another view with content Text("From iOS 14+") to test both block runs
}
}
}
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
}
}
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView() // Add another view with content Text("From iOS 13") to test both block runs
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
func sceneDidDisconnect(_ scene: UIScene) {
//
}
func sceneDidBecomeActive(_ scene: UIScene) {
//
}
func sceneWillResignActive(_ scene: UIScene) {
//
}
func sceneWillEnterForeground(_ scene: UIScene) {
//
}
func sceneDidEnterBackground(_ scene: UIScene) {
//
}
}
第 3 步:测试
- 从
XCode -> Preferences -> Components安装iOS 13模拟器
- 为 iOS 13 和 iOS 14 创建两个单独的视图文件,然后从主 swift 文件中调用它。
- 测试和验证后,只需使用单一视图文件即可。
- 对代码块使用
if #available(iOS 14, *) {} 条件,对类或其他对象使用@available(iOS 15, *)。