2025-07-28ios/Classes/InAppWebView/InAppWebView.swift:1036:21 Ambiguous use of 'evaluateJavaScrip...

flutter_inappwebview: ^6.0.0

  flutter_inappwebview:
    dependency: "direct main"
    description:
      name: flutter_inappwebview
      sha256: "3e9a443a18ecef966fb930c3a76ca5ab6a7aafc0c7b5e14a4a850cf107b09959"
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "6.0.0"

/Users/huchu/.pub-cache/hosted/pub.flutter-io.cn/flutter_inappwebview_ios-1.0.13/ios/Classes/InAppWebView/InAppWebView.swift:1036:21 Ambiguous use of 'evaluateJavaScript(_:completionHandler:)'


image.png

报错
oc实现:
WKWebView.h
iOS 18:

 - (void)evaluateJavaScript:(NSString *)javaScriptString 
completionHandler:(WK_SWIFT_UI_ACTOR 
void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;

WK_SWIFT_UI_ACTOR 是 Apple 从 iOS 17 SDK 开始引入的宏,用来标记 WebKit 中部分回调接口,表明它们在 Swift 并发模型里应当运行在 @MainActor(即主线程)隔离上下文。

具体说明:
在 iOS 16 及之前的 SDK 里,evaluateJavaScript:completionHandler: 是没有这个宏的。

从 iOS 17 SDK 开始,Apple 在 WebKit 框架头文件中添加了 WK_SWIFT_UI_ACTOR 宏,用于向 Swift 传递“这个回调是在主线程执行”的信息。

它对应的 Swift 等价是给该方法及其回调添加 @MainActor 属性,方便 Swift 并发代码安全调用。

swift桥接:
WebKit.WKWebView

  open func evaluateJavaScript(_ javaScriptString: String, 
completionHandler: (@MainActor @Sendable 
    (Any?, (any Error)?) -> Void)? = nil)

InAppWebView.swift实现

   public override func evaluateJavaScript(_ javaScriptString: String, 
completionHandler: ((Any?, Error?) -> Void)? = nil) {

因此报错,正确的写法是:

    open override func evaluateJavaScript(_ javaScriptString: String, 
completionHandler: (@MainActor @Sendable
 (Any?, (any Error)?) -> Void)? = nil) {
 
    }

继续看官方的更新 flutter_inappwebview 6.1.5

   flutter_inappwebview:
    dependency: "direct main"
    description:
      name: flutter_inappwebview
      sha256: "80092d13d3e29b6227e25b67973c67c7210bd5e35c4b747ca908e31eb71a46d5"
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "6.1.5"

使用了#if compiler(>=6.0)条件编译


#if compiler(>=6.0)
    public override func evaluateJavaScript(_ javaScriptString: String, completionHandler: (@MainActor @Sendable (Any?, (any Error)?) -> Void)? = nil) {
        if let applePayAPIEnabled = settings?.applePayAPIEnabled, applePayAPIEnabled {
            if let completionHandler = completionHandler {
                completionHandler(nil, nil)
            }
            return
        }
        super.evaluateJavaScript(javaScriptString, completionHandler: completionHandler)
    }
#else
    public override func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil) {
        if let applePayAPIEnabled = settings?.applePayAPIEnabled, applePayAPIEnabled {
            if let completionHandler = completionHandler {
                completionHandler(nil, nil)
            }
            return
        }
        super.evaluateJavaScript(javaScriptString, completionHandler: completionHandler)
    }
#endif


解释一下#if compiler(>=6.0) 条件编译和 Runner.xcodeproj/project.pbxproj的swift version版本、xcode版本、ios sdk系统版本的关系,结论:

和 iOS 版本无关
这是编译期判断,不关心运行时设备上的 iOS 版本。

不论你目标是 iOS 14、iOS 17 还是 iOS 18,这个条件编译结果都不会变。

和 Xcode 版本有关

因为 Xcode 自带 Swift 编译器。

Xcode 16.2 自带的 Swift 编译器版本大约是 Swift 6.x,所以 compiler(>=6.0) 为真。

和工程中配置的 SWIFT_VERSION 无关
工程里的:

SWIFT_VERSION = 5.0

只是告诉编译器:用 Swift 5.0 的语法兼容模式编译代码。

但是用的仍然是 Xcode 16.2 自带的 Swift 6.x 编译器,所以 #if compiler(>=6.0) 依然成立。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容