Skip to content

在AppDelegate中处理旧版iOS启动流程

适配旧版iOS启动流程的必要性

在告别Storyboard的纯代码项目中,我们通常会利用SceneDelegate来管理iOS 13及更高版本应用的生命周期和UI。然而,为了确保你的应用能在更广泛的设备上运行,特别是那些仍在使用iOS 12或更早版本的用户,对AppDelegate进行适当的配置是至关重要的。这就像为你的应用搭建了一座时光机,让它能无缝穿梭于新旧系统之间!🚀

配置AppDelegate以支持旧版系统

当你的应用在iOS 12或更早的系统上启动时,系统不会调用SceneDelegate。相反,它会直接与AppDelegate进行交互。因此,你需要在AppDelegate中实现一个关键方法来设置应用的初始界面。这个方法就是application(_:didFinishLaunchingWithOptions:),它是应用启动的入口点。

swift
// AppDelegate.swift

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow? // 为旧版iOS声明一个UIWindow属性

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // 仅在iOS 13以下版本执行此代码
        if #available(iOS 13.0, *) {
            // iOS 13及更高版本由SceneDelegate处理
        } else {
            // 为旧版iOS手动设置window和根视图控制器
            window = UIWindow(frame: UIScreen.main.bounds)
            window?.rootViewController = ViewController() // 假设你的初始视图控制器是ViewController
            window?.makeKeyAndVisible()
        }
        return true
    }

    // MARK: UISceneSession lifecycle (iOS 13+ only)
    // ... 其他SceneDelegate相关方法 ...
}

深入理解#available条件编译

你可能注意到了代码中的#available(iOS 13.0, *)。这是一个非常强大的Swift特性,被称为条件编译。它允许你根据运行时的iOS版本来执行不同的代码块。这意味着你可以编写一套代码,既能完美支持最新的iOS系统,又能优雅地兼容旧版本,真是太棒了!✨

  • iOS 13.0: 指定了该代码块适用的最低iOS版本。
  • *: 表示在所有其他更高版本上都适用。

设置旧版应用的根视图控制器

application(_:didFinishLaunchingWithOptions:)方法中,当检测到是iOS 13以下系统时,你需要手动完成以下步骤:

  1. 创建UIWindow实例:
    • window = UIWindow(frame: UIScreen.main.bounds):这会创建一个与设备屏幕大小相同的窗口。UIWindow是所有视图的容器,没有它,你的应用就无法显示任何内容。
  2. 设置根视图控制器:
    • window?.rootViewController = ViewController():将你的初始视图控制器(例如ViewController)设置为窗口的根视图控制器。这是应用启动后用户看到的第一个界面。
  3. 使窗口可见:
    • window?.makeKeyAndVisible():这个方法会使你的窗口成为主窗口并显示出来。没有这一步,即使你设置了根视图控制器,用户也看不到它。

确保兼容性的重要性

忽略旧版iOS的兼容性可能会导致你的应用无法在大量设备上运行,从而失去潜在用户。根据最新的统计数据,虽然iOS 13及更高版本的普及率很高,但仍有约5%到10%的用户停留在旧版本。通过在AppDelegate中进行这些简单的配置,你就能确保你的应用能够触达更广泛的用户群体,让更多人体验到你的精彩作品!这绝对是值得投入的精力!👍

本站使用 VitePress 制作