(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
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()
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
Supprimer Application Scene Manifest
clé de Info.plist
Supprimer SceneDelegate.Swift
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
}
}