web-dev-qa-db-fra.com

Les méthodes de délégué de l'application ne sont pas appelées dans iOS 13

J'utilise Xcode 11 et construisez une application pour iOS 13. Dans un nouveau projet, j'ai créé en Xcode certaines des méthodes UIAPPLLICATIONDélégate de l'UIAPPLicationDelegate, donc je les ai ajoutées dans le fichier de délégué de l'application. Le nouveau modèle d'un projet "App de visualisation unique" manquait les méthodes. Le problème est qu'aucune des méthodes de délégation ne s'appelle appelée sauf -application:didFinishLaunchingWithOptions:. Voici mon délégué de l'application:

@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<UISceneSession *> *)sceneSessions {
}

@end
57
nevan king

L'application et le cycle de vie de la scène n'est pas la même chose!

enter image description here

À mon avis, invalidant les appels de méthodes de changement d'État d'application (ainsi que d'envoyer des notifications de changement d'État d'application sur le changement de l'état de chaque scène), c'est une erreur, même s'il y avait une intention compréhensible de forcer les programmeurs à s'adapter au cycle de vie des nouvelles scènes.

Voici un modèle de délégué de scène Restauration des appels attendus des méthodes de changement d'État d'application du délégué de l'application:

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
    
    func sceneWillResignActive(_ scene: UIScene) {
        
        if !UIApplication.shared.connectedScenes.contains(where: { $0.activationState == .foregroundActive && $0 != scene }) {
            UIApplication.shared.delegate?.applicationWillResignActive?(.shared)
        }
    }
    
    
    func sceneDidEnterBackground(_ scene: UIScene) {
        
        if !UIApplication.shared.connectedScenes.contains(where: { $0.activationState == .foregroundActive || $0.activationState == .foregroundInactive }) {
            UIApplication.shared.delegate?.applicationDidEnterBackground?(.shared)
        }
    }
    
    
    func sceneWillEnterForeground(_ scene: UIScene) {
        
        if !UIApplication.shared.connectedScenes.contains(where: { $0.activationState == .foregroundActive || $0.activationState == .foregroundInactive }) {
            UIApplication.shared.delegate?.applicationWillEnterForeground?(.shared)
        }
    }
    
    
    func sceneDidBecomeActive(_ scene: UIScene) {
        
        if !UIApplication.shared.connectedScenes.contains(where: { $0.activationState == .foregroundActive && $0 != scene }) {
            UIApplication.shared.delegate?.applicationDidBecomeActive?(.shared)
        }
    }
}

Scedelegate.swift

0
DnV