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:)'

报错
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) 依然成立。