热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS13中未调用应用程序委托方法

如何解决《iOS13中未调用应用程序委托方法》经验,为你挑选了1个好方法。

我正在使用Xcode 11并为iOS 13构建应用程序。在Xcode中创建的新项目中,缺少一些UIApplicationDelegate方法,因此我将它们重新添加到了应用程序委托文件中。“单视图应用程序”项目的新模板缺少这些方法。问题在于,除了之外,没有其他任何委托方法被调用-application:didFinishLaunchingWithOptions:。这是我的应用程序委托:

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"application:didFinishLaunchingWithOptions:");
    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"applicationDidEnterBackground:");
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"applicationWillEnterForeground:");
}
#pragma mark - UISceneSession lifecycle

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

- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet *)sceneSessions {
}

@end

nevan king.. 63

iOS 13具有一种发送应用程序生命周期事件的新方法。相反,通过未来的UIApplicationDelegate他们来过UIWindowSceneDelegate这是一个UISceneDelegate子协议。UISceneDelegate具有重要的委托方法。

此更改是为了在iOS 13中支持多个窗口。WWDC 2019会话212“ 在iPad上引入多个窗口”中有更多信息。技术信息的发布时间大约是14:30,由一位穿着高顶鞋的男人提供。较短的会议258“ 为多个Windows构筑您的应用程序”还对更改进行了很好的介绍。

它是这样工作的:如果Info.plist中有一个“ Application Scene Manifest ”,并且您的应用程序委托有一个configurationForConnectingSceneSession方法,UIApplication则不会将后台和前台生命周期消息发送给您的应用程序委托。这意味着这些方法中的代码将无法运行:

applicationDidBecomeActive

applicationWillResignActive

applicationDidEnterBackground

applicationWillEnterForeground

应用程序委托仍将接收willFinishLaunchingWithOptions:didFinishLaunchingWithOptions:方法调用,因此这些方法中的任何代码将像以前一样工作。

如果您希望恢复以前的行为,则需要

    从应用程序的Info.plist中删除“ Application Scene Manifest”条目

    注释或删除application:configurationForConnectingSceneSession:options:方法(或Swift application(_:configurationForConnecting:options:)函数)

    将window属性添加回您的应用程序委托(@property (strong, nonatomic) UIWindow *window;

或者,打开Xcode创建的SceneDelegate文件,并在其中使用新的生命周期方法:

- (void)sceneDidBecomeActive:(UIScene *)scene {
}
- (void)sceneWillResignActive:(UIScene *)scene {
}
... etc

UIScene通过在Info.plist中将“启用多个Windows”(“ UIApplicationSupportsMultipleScenes”)设置为“ NO”(这是新项目的默认设置),可以在不采用多窗口支持的情况下使用新的生命周期资料。这样,您可以在较小的步骤中开始采用新的API。

您可以看到场景委托方法名称与应用程序委托名称紧密匹配。一个令人困惑的事情是应用程序委托方法没有被弃用,因此,如果同时具有应用程序委托和场景委托方法,则不会收到警告,但只会调用一个。

其他的事情UISceneDelegate还包括用户活动(continueUserActivity:等),状态恢复(stateRestorationActivityForScene:等),状态栏问题和打开的URL。(我不确定它们是否代替了应用程序委托方法)。它还具有生命周期事件的类似通知(例如UISceneWillDeactivateNotification)。

在WWDC会议上,一些适合您的图像:

Swift的等效功能:

班级职责:



1> nevan king..:

iOS 13具有一种发送应用程序生命周期事件的新方法。相反,通过未来的UIApplicationDelegate他们来过UIWindowSceneDelegate这是一个UISceneDelegate子协议。UISceneDelegate具有重要的委托方法。

此更改是为了在iOS 13中支持多个窗口。WWDC 2019会话212“ 在iPad上引入多个窗口”中有更多信息。技术信息的发布时间大约是14:30,由一位穿着高顶鞋的男人提供。较短的会议258“ 为多个Windows构筑您的应用程序”还对更改进行了很好的介绍。

它是这样工作的:如果Info.plist中有一个“ Application Scene Manifest ”,并且您的应用程序委托有一个configurationForConnectingSceneSession方法,UIApplication则不会将后台和前台生命周期消息发送给您的应用程序委托。这意味着这些方法中的代码将无法运行:

applicationDidBecomeActive

applicationWillResignActive

applicationDidEnterBackground

applicationWillEnterForeground

应用程序委托仍将接收willFinishLaunchingWithOptions:didFinishLaunchingWithOptions:方法调用,因此这些方法中的任何代码将像以前一样工作。

如果您希望恢复以前的行为,则需要

    从应用程序的Info.plist中删除“ Application Scene Manifest”条目

    注释或删除application:configurationForConnectingSceneSession:options:方法(或Swift application(_:configurationForConnecting:options:)函数)

    将window属性添加回您的应用程序委托(@property (strong, nonatomic) UIWindow *window;

或者,打开Xcode创建的SceneDelegate文件,并在其中使用新的生命周期方法:

- (void)sceneDidBecomeActive:(UIScene *)scene {
}
- (void)sceneWillResignActive:(UIScene *)scene {
}
... etc

UIScene通过在Info.plist中将“启用多个Windows”(“ UIApplicationSupportsMultipleScenes”)设置为“ NO”(这是新项目的默认设置),可以在不采用多窗口支持的情况下使用新的生命周期资料。这样,您可以在较小的步骤中开始采用新的API。

您可以看到场景委托方法名称与应用程序委托名称紧密匹配。一个令人困惑的事情是应用程序委托方法没有被弃用,因此,如果同时具有应用程序委托和场景委托方法,则不会收到警告,但只会调用一个。

其他的事情UISceneDelegate还包括用户活动(continueUserActivity:等),状态恢复(stateRestorationActivityForScene:等),状态栏问题和打开的URL。(我不确定它们是否代替了应用程序委托方法)。它还具有生命周期事件的类似通知(例如UISceneWillDeactivateNotification)。

在WWDC会议上,一些适合您的图像:

Swift的等效功能:

班级职责:


是的,的确是,但是老实说,我只是创建一个新项目并将所有我的源代码文件添加到其中。我已经尝试修复它太长时间了,甚至在苹果论坛上都解释了这种情况,没人知道发生了什么。典型的XCode越野车行为。
推荐阅读
author-avatar
墨鱼轩869
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有