Xcode 26之前不需要多窗口的很多app没有适配SceneDelegate,升级到Xcode 26后运行没有问题,但是控制台有以下输出:
swift
`UIScene` lifecycle will soon be required. Failure to adopt will result in an assert in the future.
UIApplicationDelegate 中的相关生命周期函数也有弃用标记:
scss
/// Tells the delegate that the application has become active
/// - Note: This method is not called if `UIScene` lifecycle has been adopted.
- (void)applicationDidBecomeActive:(UIApplication *)application API_DEPRECATED("Use UIScene lifecycle and sceneDidBecomeActive(_:) from UISceneDelegate or the UIApplication.didBecomeActiveNotification instead.", ios(2.0, 26.0), tvos(9.0, 26.0), visionos(1.0, 26.0)) API_UNAVAILABLE(watchos);
建议尽早适配
方案举例
以下是我的适配方案,供大家参考
- 兼容iOS13以下版本;
- app只有单窗口场景。
1. 配置Info.plist
Delegate Class Name和Configuration Name 可自定义

2. 配置SceneDelegate
- 创建SceneDelegate class 类名要和Info.plist中配置一致

- appDelegate中实现代理
objectivec
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options API_AVAILABLE(ios(13.0)){
// name要和Info.plist中配置一致
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions API_AVAILABLE(ios(13.0)){
// 释放资源,单窗口app不用关注
}
3. 新建单例 AppLifecycleHelper 实现AppDelegate和SceneDelgate共享的方法
- iOS 13 及以上需要在
scene: willConnectToSession: options:方法中创建Window,之前仍然在didFinishLaunchingWithOptions:
AppDelegate:
less
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[AppLifecycleHelper sharedInstance].launchOptions = launchOptions;
// ... 自定义逻辑
if (@available(iOS 13, *)) {
} else {
[[AppLifecycleHelper sharedInstance] createKeyWindow];
}
}
SceneDelgate:
URL冷启动APP时不调用openURLContexts方法,这里保存URL在DidBecomeActive处理
objectivec
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions API_AVAILABLE(ios(13.0)){
[[AppLifecycleHelper sharedInstance] createKeyWindowWithScene:(UIWindowScene *)scene];
// 通过url冷启动app,一般只有一个url
for (UIOpenURLContext *context **in** connectionOptions.URLContexts) {
NSURL *URL = context.URL;
if (URL && URL.absoluteString.length > 0) {
self.launchUrl = URL;
}
}
}
AppLifecycleHelper:
AppLifecycleHelper
- (void)createKeyWindow {
UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
[self setupMainWindow:window];
}
- (void)createKeyWindowWithScene:(UIWindowScene *)scene API_AVAILABLE(ios(13.0)) {
UIWindow *window = [[UIWindow alloc] initWithWindowScene:scene];
[self setupMainWindow:window];
}
- (void)setupMainWindow:(UIWindow *)window {
}
- 实现SceneDelegate后appDelegate 中失效的方法
在AppLifecycleHelper中实现,共享给两个DelegateClass
AppDelegate
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[AppLifecycleHelper sharedInstance] appDidBecomeActive];
}
- (void)applicationWillResignActive:(UIApplication *)application {
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
}
/// URL Scheme
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, **id**> *)options {
}
/// 接力用户活动
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<**id**<UIUserActivityRestoring>> * _Nullable))restorationHandler {
}
/// 快捷方式点击
- (void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler API_AVAILABLE(ios(9.0)) {
}
SceneDelegate部分代码示例:
SceneDelegate
- (void)sceneDidBecomeActive:(UIScene *)scene API_AVAILABLE(ios(13.0)){
[[AppLifecycleHelper sharedInstance] appDidBecomeActiveWithLaunchUrl:self.launchUrl];
// 清空冷启动时的url
self.launchUrl = nil;
}
这个方法总结下来就是求同存异,由Helper提供SceneDelegate与AppDelegate相同或类似的方法,适合单窗口、且支持iOS 13以下的app;
另外注意URL Scheme冷启动app不会执行openURL需要记录URL,在合适的时机(一般是DidBecomeActive)处理。