iOS中的Objective-C (OC) 与 JavaScript (JS) 交互主要通过两种方式实现:UIWebView
和 WKWebView
,其中 WKWebView
是推荐的方式,因为它提供了更好的性能和更低的内存占用。以下是基于 WKWebView
的交互原理和示例代码。
WKWebView
和 JavaScriptCore
框架,可以实现 Objective-C 与 JavaScript 之间的双向通信。JavaScriptCore
框架提供了 JSContext
类,它是 JavaScript 的执行环境,允许在原生应用中嵌入 JavaScript 引擎,实现高级的 JS 与原生代码之间的交互。JavaScriptCore
框架直接调用 JS 方法。WKWebView
的 evaluateJavaScript:completionHandler:
方法实现。首先,需要创建一个 WKUserContentController
并添加自定义的 JavaScript 代码,然后在 Objective-C 中定义一个方法,该方法可以被注入的 JavaScript 代码调用。window.webkit.messageHandlers
对象来注册原生对象,从而实现调用原生方法。例如,在 Objective-C 中定义的方法可以被 JavaScript 通过 window.webkit.messageHandlers.nativeFunction.postMessage
调用。以下是一个简单的示例,展示了如何在 iOS 中使用 WKWebView
和 JavaScriptCore
框架实现 OC 与 JS 的交互:
// Objective-C 代码
WKWebView *webView = ...;
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
[webView.configuration.userContentController addUserScript:[WKUserScript scriptWithSource:@"window.webkit.messageHandlers.nativeFunction.postMessage('Hello from JS');" language:WKUserScriptLanguageJavaScript injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
[webView evaluateJavaScript:@"window.webkit.messageHandlers.nativeFunction.postMessage('Hello from OC');" completionHandler:^(id result, NSError *error) {
if (error) {
NSLog(@"Error: %@", error);
} else {
NSLog(@"Result from JS: %@", result);
}
}];
// JavaScript 代码
window.webkit.messageHandlers.nativeFunction.postMessage('Hello from JS');
通过上述方法,开发者可以在 iOS 应用中实现与 Web 页面的高效交互,无论是调用原生功能还是传递数据。
领取专属 10元无门槛券
手把手带您无忧上云