专栏首页大话swiftiPadOS上启动黑屏翻车问题分析(二)

iPadOS上启动黑屏翻车问题分析(二)

iPadOS上启动黑屏翻车问题分析(一)

昨天我们说了旧的项目在iOS 13下完全启动之后黑屏的问题,然后紧跟问题通过UI图层分析方式一步步的分析基本找到了问题的根源---iPadOS的底层以及操作思路转变啦

单窗口时代

咱们暂且吧单窗口的iOS定义为旧时代,也就是之前的iOS应用默认的情况下基于单一窗口模式开发的(如下图),而作为开发人员也是十分的享受这种内置的开发模版

新的时代--支持多窗口模式

在升级到iOS 13之后系统开始支持多窗口这个尤其是在iPadOS上尤为显著,这样你可以同时的在一个设备屏幕上同时享受到至少两个App的视图内容…

AppDelegate对App管理权限的转移

我们提到之前的iOS App是基于单视窗的而我们在开发中也是默认情况下不去而外的去添加新的window,因此在这种情况下我们的APPDelegate就成了整个App的生命周期的管理者啦。但是iOS 13之后这个规律被打破,将很多的任务转移给了UIWindowScene

旧项目黑屏拯救

既然App的声明周期在转移那么我们的App代码也要跟着迁移处理

1 Info.plist更改

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>UIApplicationSupportsMultipleScenes</key>
  <true/>
  <key>UISceneConfigurations</key>
  <dict>
    <key>UIWindowSceneSessionRoleApplication</key>
    <array>
      <dict>
        <key>UISceneDelegateClassName</key>
        <string>$(TARGET_NAME).SceneDelegate</string>
        <key>UISceneStoryboardFile</key>
        <string>Main</string>
        <key>UISceneConfigurationName</key>
        <string>Default Configuration</string>
      </dict>
    </array>
  </dict>
</dict>
</plist>

Swift来说由于一般情况下

OC项目配置

从plist配置来看的话,我们需要新建一个类来作为WindowScene的代理的载体

②对APPDelegate的修改

OC版本

-(UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options API_AVAILABLE(ios(13.0)){
    UISceneConfiguration * config = [[UISceneConfiguration alloc] initWithName:@"Default" sessionRole:connectingSceneSession.role];
    
    return config;
}

Swift版本

    func application(_ application: UIApplication,
                     configurationForConnecting connectingSceneSession: UISceneSession,
                     options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

从API_AVAILABLE(ios(13.0))的attribute可知这个会在iOS13才会调用,我们做好版本兼容即可

③ 新建的SceneDelegate载体

OC版本

.m文件

#import "SceneDelegate.h"
#import "LoginViewController.h"
@interface SceneDelegate()

@end
@implementation SceneDelegate
-(void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions API_AVAILABLE(ios(13.0)){
         UIWindow * aWindow = [[UIWindow alloc] initWithWindowScene:scene];
    
    aWindow.rootViewController = [[LoginViewController alloc] init];
    self.window = aWindow;
    [self.window makeKeyAndVisible];
    AppDelegate *app = [UIApplication sharedApplication].delegate;
    [app setWindow:self.window];
 }
@end

上篇文章我们分析到UIWindow的继承关系发生了变化需要通过Scene来进行初化,而Scene变化为称为Respender的子类可以响应事件而不再是之前那个单纯的UIScene

在这个为了对以前的代码的支持我们依然给AppDelegate一个window,但是这个已经不是之前项目那个widow那么简单啦

Swift版本我们就不详细说了代码逻辑依然是OC的

class SceneDelegate: UIResponder,UIWindowSceneDelegate {
    var window: UIWindow?
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        var aWindow = UIWindow(windowScene: scene as! UIWindowScene)
        aWindow.rootViewController = LoginViewController()
        
        self.window = aWindow
        self.window?.makeKeyAndVisible()
        var app: AppDelegate = UIApplication.shared.delegate as! AppDelegate
        app.window = window
    }
}

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于移动端适配,你必须要知道的

    上面这些问题可能我们在开发中已经知道如何解决,但是问题产生的原理,以及解决方案的原理可能会模糊不清。在解决这些问题的过程中,我们往往会遇到非常多的概念:像素、分...

    coder_koala
  • LVS集群-DR模式

    director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半...

    胡齐
  • 干货 | 关于SwiftUI,看这一篇就够了

    梁启健,携程金融支付中心开发工程师,主要负责支付iOS端的开发与优化工作,喜欢研究大前端和跨平台技术。

    用户1292807
  • 数据分析高级教程(三)

    oozie job -D inpath=/weblog/input -D outpath=/weblog/outpre-config weblog/job.pr...

    我被狗咬了
  • Linux下常用的监控工具和命令

    如果性能测试的目标服务器是linux系统,在如何使用linux自带的命令来实现性能测试过程的监控分析呢?

    测试小兵
  • 科技体验|ios13你升级了吗?

    说到苹果,我想大家肯定都十分的了解,喜欢苹果手机的用户大部分是因为苹果流畅的系统和丰富的功能,这是苹果手机最大的优势。

    测试邦
  • dstat

    官方对dstat的定义为:多功能系统资源统计生成工具( versatile tool for generating system resource statis...

    胡齐
  • SAP ABAP BOR type

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    Jerry Wang
  • Flutter状态管理(2)——单Stream和广播Stream

    在Flutter状态管理(1)——InheritedWidget中介绍了状态管理以及如何使用InheritedWidget来实现全局状态的管理。这篇博客将介绍如...

    用户1108631
  • 微信H5页面兼容性解决方案

    最近给公司微信公众号,写了微信h5业务页面,总结分享一下前端开发过程中的几个兼容性坑,项目直接拿的公司页面,所以下文涉及图片都模糊处理了。

    coder_koala

扫码关注云+社区

领取腾讯云代金券