Capacitor插件使用ASWebAuthenticationSession:主线程调用UIView.window报错求助
解决ASWebAuthenticationSession中UIView.window主线程调用警告
在自定义Capacitor插件对接Keycloak时,使用ASWebAuthenticationSession的presentationAnchor(for:)方法访问self.bridge?.webView?.window时,会触发以下警告:
UIView.window must be used from main thread only
解决方案
UIKit的所有UI相关API(包括访问UIView.window)必须在主线程执行,因此需要确保获取window的操作在主线程中完成。可以通过DispatchQueue.main.sync强制在主线程执行该逻辑:
修改后的代码如下:
@available(iOS 13.0, *) @objc(KeycloakPlugin) public class KeycloakPlugin: CAPPlugin, ObservableObject, ASWebAuthenticationPresentationContextProviding { var webAuthSession: ASWebAuthenticationSession? public func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor { // 强制在主线程获取webView的window let window = DispatchQueue.main.sync { self.bridge?.webView?.window } return window ?? ASPresentationAnchor() } }
可选优化
如果想避免在已处于主线程时的不必要同步,可以先检查当前线程:
public func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor { var window: ASPresentationAnchor? if Thread.isMainThread { window = self.bridge?.webView?.window } else { window = DispatchQueue.main.sync { self.bridge?.webView?.window } } return window ?? ASPresentationAnchor() }
以上两种方式都能消除警告,同时保证UI操作的线程安全性。
内容的提问来源于stack exchange,提问作者Giovanni Filannino
相关产品推荐
相关产品推荐

