iOS 13/Facebook SDK 错误“无法找到有效的 UIWindow”

Posted

技术标签:

【中文标题】iOS 13/Facebook SDK 错误“无法找到有效的 UIWindow”【英文标题】:iOS 13/Facebook SDK error "Unable to find a valid UIWindow" 【发布时间】:2019-10-29 20:36:45 【问题描述】:

(为了阻止善意的建议,是的,我上周在 Facebook 的开发者论坛上发布了这个问题。还没有回复。)

TL;DR

Facebook SDK 5.8 在启动时报错FBSDKLog: Unable to find a valid UIWindow

主要故事

在从头开始的单视图 Xcode 11/ios 13 项目中,不再有与​​应用程序关联的默认 UIWindowmember。 (窗口本身仍然存在;您可以使用 Xcode 中的 View Hierarchy Debugger 或 Reveal 应用程序看到它,包含在 UIWindowScene 中。)

FBSDK 5.8 似乎确实支持 iOS-13,并四处寻找。相关代码在第498行

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

Facebook 的代码遍历应用程序的connectedScenes 成员,对我来说这是一个空集。如何修改我的代码以便 FBSDK 找到窗口?

一些黑客行为

我尝试将以下内容添加到scene(_:willConnectTo:options:),但似乎为时已晚——此时 FBSDKLog 消息已经出现。 (所以我在挥舞......)

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

下面的也失败了,不过也只是摸不着头脑:

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()

【问题讨论】:

@Andrew Duncan 你找到解决办法了吗? 没有 没有听说过,无论是在这里还是在 Facebook 的论坛上。现在没关系,因为我使用的是用早期版本的 Xcode 创建的项目。但是对于创建新项目,一种解决方法可能是使用旧 Xcode 项目模板的集合:github.com/rmaddy/XcodeTemplates。 【参考方案1】:

如果你不使用新的行为并且不介意恢复到旧的方式,你可以尝试以下

    Info.plist 中删除Application Scene Manifest 密钥

    删除SceneDelegate.swift

    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
        
    
    
    

【讨论】:

我认为这不是一个有效的答案。 这对我有帮助。我的作品。此解决方案仅在您绕过场景委托时有效。【参考方案2】:
    window 变量添加到AppDelegate
    class AppDelegate: UIResponder, UIApplicationDelegate 
    
    var window: UIWindow?
    
    didFinishLaunchingWithOptions 内分配UIWindow
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    
         window = UIWindow(frame: UIScreen.main.bounds)
         if let window = window 
             window.makeKeyAndVisible()
             self.window = window
         
    
         ApplicationDelegate.shared.application(
              application,
              didFinishLaunchingWithOptions: launchOptions
         )
    
         return true
     
    

【讨论】:

以上是关于iOS 13/Facebook SDK 错误“无法找到有效的 UIWindow”的主要内容,如果未能解决你的问题,请参考以下文章

FB ios SDK 3.13.1 操作无法完成(com.facebook.sdk 错误2)

由于网络错误 - IMA SDK 错误和 iOS,无法从服务器请求广告

错误:无法定位 SDK“iphonesimulator9.0”

Google iOS SDK 无法存档(使用未声明的标识符错误)

操作无法完成 com.facebook.sdk 错误 3 - IOS-react-native-FBSDK

将 Google Map SDK 添加到 iOS6 时将错误无法识别的选择器发送到类