创建不使用 UIScene 的工程
创建不使用 UIScene 的工程
本文记录了创建不使用 UIScene 的工程的两种方法
- 暴力删除法, 直接删除 UIScene 相关配置,不做支持
- 版本适配法, 针对 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 进行授权