文章

创建不使用 UIScene 的工程

创建不使用 UIScene 的工程

本文记录了创建不使用 UIScene 的工程的两种方法

  1. 暴力删除法, 直接删除 UIScene 相关配置,不做支持
  2. 版本适配法, 针对 iOS 12 以下系统使用 AppDelegete, iOS 13 + 使用 UIScene

UIScene 已经是 Xcode 默认创建项目的默认配置了, 并且现在开发新项目也基本都支持 iOS 13+ 了, 但是仍有些老旧项目依然需要适配 iOS 13 以下的版本. 恰逢我今天重构 YYUIKit Demo 工程的时候需要适配较低的版本, 遂记录一下.

YYUIKit 是我开源的一套 UI 开发工具包, 主要包含 Foundation 拓展和常用 UIKit 控件拓展和一些高频自定义组件封装, 旨在提高开发效率, 欢迎有缘人使用, 好用的话也欢迎点赞💪

暴力删除 UIScene 配置, 直接不支持 UIScene

核心就是删除 UIScene 配置, 所见一个不留. 步骤如下:

  • 创建新 Xcode 项目
  • 找到默认创建的 SceneDelegate.swift 文件, 直接删除
  • 打开 AppDelegate.swift 文件, 删除 UIScene 内容, 手动创建 UIWindow
  • 打开 Info.plist, 删除 UIApplicationSceneManifest 整个配置项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//  AppDelegate.swift

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    // 需要手动创建 window
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        // 配置 window.rootVC
        window?.frame = UIScreen.main.bounds;
        window?.backgroundColor = UIColor.white
        window?.makeKeyAndVisible()
        window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController()
        
        return true
    }

}

版本适配法, 区分版本从 iOS 13 开始适配

找到代码中 UIScene 相关 API, 单独抽取出来, 并将其设置为 @available(iOS 13.0, *) 即可. 具体步骤如下:

  • 创建新 Xcode 项目
  • 打开默认创建的 SceneDelegate.swift 文件, 并在 class 声明地方添加 @available(iOS 13.0, *)
1
2
3
4
5
//  SceneDelegate.swift
import UIKit

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate { ... }
  • 打开 AppDelegate.swift 文件, 并剥离 UIScene
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//  AppDelegate.swift

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        return true
    }   
}


@available(iOS 13.0, *)
extension AppDelegate {
    // MARK: UISceneSession Lifecycle
    
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 
    }
    
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    }
}

然后直接运行就 OK.


THE END.

本文由作者按照 CC BY 4.0 进行授权