美文网首页
iOS13:UISceneDelegate

iOS13:UISceneDelegate

作者: 康小曹 | 来源:发表于2019-12-18 15:50 被阅读0次

    本文涉及的内容:

    1. iOS13中UISceneDelegate所带来的的变化;
    2. 如何配置使得在iOS13中不使用默认的UISceneDelegate

    概述

    iOS13上,仍然不支持 iPhone 分屏功能,其带来的是 iOS开发中 App 生命中期代理者的改变,原先生命周期函数由 AppDelegate 进行管理,现在不仅 AppDelegate 可以管理,SceneDelegate 也可以对 App 的声明周期函数进行代理,且在 Xcode10 中默认为SceneDelegate 。若两者同时存在,SceneDelegate 优先级更高。

    变化

    此次改变只涉及到app状态的变化,也就是app的声明周期函数,比如WillEnterForegroundWillResignActiveDidEnterBackground等。didFinishLaunchingWithOptions不属于 App 状态的变化,准确来讲,官网用的词语为transition。其变化内容为:

    • iOS13之前:在app状态发生改变时,UIKit 框架会发送通知到UIApplicationDelegate 对象上;
    • iOS13及其以后,在app状态发生改变时,UIKit 会优先发送通知到 SceneDelegate对象上;

    结果就是:

    • UIApplicationDelegate对象上只剩下三个函数:
    1. 加载完成:didFinishLaunchingWithOptions
    2. 配置将要连接的场景:configurationForConnectingSceneSession
    3. 丢弃场景对象之后:didDiscardSceneSessions
    • SceneDelegate接管了所有的 app 过渡函数和场景的连接:
    1. 将要连接场景:willConnectToSession
    2. 已连接场景:sceneDidDisconnect
    3. sceneDidBecomeActive
    4. sceneWillResignActive
    5. sceneWillEnterForeground
    6. sceneDidEnterBackground

    注意

    1. iOS13 之后不代表一定有分屏,也不代表 iPhone 可以使用分屏功能,当前仍然只有 iPad 可以使用分屏功能;
    2. 开启分屏需要勾选Supports multiple windows并进行配置和支持,iPad 开发在此不讨论,所以不会展开分屏功能的开发细节;

    新工程的配置

    Xcode10 中,默认会创建SceneDelegate并且在 info.plist 中生成对应的配置,如下:

    SceneDelegate

    info.plist 如下


    info.plist

    如果不想使用SceneDelegate也是可以的,需要:

    1. 删除 info.plist 中的Scene Configuration配置;

      info.plist
    2. AppDelegate中添加applicationWillEnterForeground等函数;

    - (void)applicationWillEnterForeground:(UIApplication *)application {
        NSLog(@"applicationWillEnterForeground");
    
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        NSLog(@"applicationDidEnterBackground");
    
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        NSLog(@"applicationDidBecomeActive");
    
    }
    
    - (void)applicationWillResignActive:(UIApplication *)application {
        NSLog(@"applicationWillResignActive");
    
    }
    
    1. AppDelegate中添加UIWindow属性;
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    @property (strong, nonatomic) UIWindow *window;
    @end
    

    其他

    其实,UISceneDelegate使得原先的AppDelegate中的代码更加简洁,是推荐使用的。如果原本项目中已经采用自定义的AppDelegate来对业务和transition函数进行了分离,可以忽略。

    相关文章

      网友评论

          本文标题:iOS13:UISceneDelegate

          本文链接:https://www.haomeiwen.com/subject/dqmdnctx.html