web-dev-qa-db-fra.com

Erreur du SDK iOS 13 / Facebook "Impossible de trouver une fenêtre d'interface utilisateur valide"

(Pour prévenir les suggestions bien intentionnées, oui, j'ai posté cette question la semaine dernière sur le forum des développeurs de Facebook. Pas encore de réponse.)

TL; DR

Facebook SDK 5.8 se plaint au démarrage FBSDKLog: Unable to find a valid UIWindow.

L'histoire principale

Dans un projet Xcode 11/iOS 13 à vue unique, il n'y a plus de UIWindow membre par défaut associé à l'application. (La fenêtre en soi est toujours là; vous pouvez le voir, contenu dans un UIWindowScene, en utilisant le débogueur de visualisation de hiérarchie dans Xcode ou l'application Reveal.)

FBSDK 5.8 semble être compatible avec iOS-13 et le recherche. Le code pertinent se trouve à la ligne 498 de

https://github.com/facebook/facebook-ios-sdk/blob/master/FBSDKCoreKit/FBSDKCoreKit/Internal/FBSDKInternalUtility.m .

Le code de Facebook parcourt le membre connectedScenes de l'application, qui pour moi est un ensemble vide. Comment modifier mon code pour que FBSDK trouve la fenêtre?

Quelques piratages

J'ai essayé d'ajouter ce qui suit à scene(_:willConnectTo:options:) mais cela semble être trop tard - le message FBSDKLog est déjà apparu à ce moment-là. (Alors je fouette ...)

guard let s = (scene as? UIWindowScene) else { return }
self.window = UIWindow(windowScene: s)

Ce qui suit a également échoué, mais ce n'était qu'un coup de feu dans le noir:

guard let s = (scene as? UIWindowScene) else { return }
self.window = UIWindow(frame: s.coordinateSpace.bounds)
self.window?.windowScene = s
self.window?.rootViewController = ViewController(nibName: nil, bundle: nil)
self.window?.makeKeyAndVisible()
5
Andrew Duncan

Si vous n'utilisez pas le nouveau comportement et que cela ne vous dérange pas de revenir à l'ancienne méthode, vous pouvez essayer ce qui suit

  1. Supprimer Application Scene Manifest clé de Info.plist

    Key to delete

  2. Supprimer SceneDelegate.Swift

  3. Ajouter var window: UIWindow?à AppDelegate.Swift

    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow? // <-- Here
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    
    //        window!.makeKeyAndVisible()
    
    
        return true
        }
    
    }
    
1