柚子快報(bào)激活碼778899分享:iOS原生與H5交互方法
柚子快報(bào)激活碼778899分享:iOS原生與H5交互方法
UIWebView
Objective-C 調(diào)用 JavaScript
在使用UIWebView時(shí),可以使用stringByEvaluatingJavaScriptFromString:方法來執(zhí)行JavaScript代碼。
示例代碼:
NSString *result = [webView stringByEvaluatingJavaScriptFromString:@"returnFunction()"];
NSLog(@"JavaScript返回值: %@", result);
JavaScript 調(diào)用 Objective-C
通過自定義URL scheme實(shí)現(xiàn)。
使用webView的一個(gè)返回BOOL類型的監(jiān)聽網(wǎng)頁的代理:shouldStartLoadWithRequest,在JS中,window.location.href = “hhh://callback” 在監(jiān)聽中監(jiān)聽頭,然后把后面的string截取出來,用SEL變?yōu)楹瘮?shù)名,然后調(diào)用
當(dāng)在JavaScript中需要調(diào)用Objective-C代碼時(shí),可以通過改變window.location來觸發(fā)Objective-C中的代理方法。
示例代碼:
在Objective-C中,你可以在UIWebViewDelegate的webView:shouldStartLoadWithRequest:navigationType:方法中捕獲這些請求:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *URL = [request URL];
if ([[URL scheme] isEqualToString:@"hhh"]) {
NSString *functionName = [URL host]; // 獲取"callback"
SEL selector = NSSelectorFromString([functionName stringByAppendingString:@":"]);
if ([self respondsToSelector:selector]) {
[self performSelector:selector withObject:nil afterDelay:0];
}
return NO;
}
return YES;
}
在JavaScript中,你可以這樣觸發(fā)Objective-C代碼:
window.location.href = "hhh://callback";
建議使用更安全的方式
雖然上述方法可行,但自定義URL scheme方法可能導(dǎo)致安全問題,例如,可能會被惡意利用執(zhí)行未授權(quán)的方法。因此,推薦使用更安全和現(xiàn)代的方法如WKWebView的WKScriptMessageHandler進(jìn)行Native和JavaScript的交互。
注意:UIWebView已經(jīng)被蘋果于棄用,使用會造成審核不通過,推薦使用WKWebView
WKWebView
1. JavaScriptCore
JavaScriptCore是一個(gè)JavaScript引擎,提供了與JavaScript上下文(context)的接口,可以用來執(zhí)行JavaScript代碼和訪問JavaScript對象。JavaScriptCore封裝了一些基礎(chǔ)的JavaScript對象,如Date、Array等,并允許你定義自己的對象和函數(shù)。
原生調(diào)用H5
在Objective-C代碼中執(zhí)行你需要的JavaScript代碼。
示例代碼:
JSContext *context = [[JSContext alloc] init];
// 執(zhí)行JavaScript
[context evaluateScript:@"your javascript code here"];
H5調(diào)用原生
在Objective-C中,可以通過context[@"functionName"]來注冊一個(gè)可以被JavaScript調(diào)用的方法。
示例代碼:
JSContext *context = [[JSContext alloc] init];
// 定義Objective-C block
context[@"log"] = ^(NSString *msg) {
NSLog(@"JS: %@", msg);
};
然后在你的JavaScript代碼中調(diào)用該方法:
log('Hello from JavaScript');
2. evaluateJavaScript和WKScriptMessageHandler
evaluate:評價(jià),評估,估值
evaluateJavaScript:實(shí)現(xiàn)原生調(diào)用H5
使用WKWebView的evaluateJavaScript方法調(diào)用JavaScript代碼,并從中獲取結(jié)果。
示例代碼:
在Objective-C中通過WKWebView調(diào)用JavaScript:
#import
// 假設(shè)self.webView是你的WKWebView實(shí)例
WKWebView *webView = [[WKWebView alloc] init];
// JavaScript代碼字符串
NSString *script = @"document.title";
// 執(zhí)行JavaScript
[webView evaluateJavaScript:script completionHandler:^(id _Nullable result, NSError * _Nullable error) {
if (error) {
NSLog(@"JavaScript執(zhí)行錯(cuò)誤: %@", error);
return;
}
NSLog(@"頁面標(biāo)題: %@", result);
}];
WKScriptMessageHandler:實(shí)現(xiàn)H5調(diào)用原生
WKWebView提供了更現(xiàn)代和功能更強(qiáng)大的接口來與JavaScript交互。evaluateJavaScript:completionHandler:方法可以執(zhí)行JavaScript代碼,并通過回調(diào)接收結(jié)果。你也可以使用WKScriptMessageHandler創(chuàng)建一個(gè)消息處理器,當(dāng)JavaScript通過window.webkit.messageHandlers.YourHandler.postMessage(data)發(fā)送消息時(shí),你可以在Objective-C的userContentController:didReceiveScriptMessage:方法中接收到。
首先在Objective-C中創(chuàng)建消息處理器:
// 在didFinishNavigation代理方法中添加JS調(diào)用OC的方法
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
// 注冊一個(gè)name為hello的js方法
[webView.configuration.userContentController addScriptMessageHandler:self name:@"hello"];
}
//實(shí)現(xiàn)WKScriptMessageHandler此代理,然后在網(wǎng)頁端通過window.webkit.messageHandlers.hello.postMessage({body: 'test'});即可調(diào)用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSLog(@"body: %@", message.body);
}
以上就是使用 evaluateJavaScript 來實(shí)現(xiàn)原生調(diào)用H5 WKScriptMessageHandler 來實(shí)現(xiàn)H5調(diào)用原生
3. WKWebViewJavascriptBridge
WKWebViewJavascriptBridge是一個(gè)流行的開源庫,用于在iOS應(yīng)用中的WKWebView和HTML頁面之間進(jìn)行JavaScript與Objective-C或Swift代碼的交互。它提供了一個(gè)簡化的接口來發(fā)送消息和調(diào)用函數(shù),使得原生代碼和Web代碼之間的通信更加便捷。
WKWebViewJavascriptBridge不完全屬于之前提到的三種方法,它實(shí)際上是基于WKWebView的WKScriptMessageHandler封裝而成的一個(gè)橋接工具,但它提供了更加高級和易用的API。
示例代碼:
首先,項(xiàng)目中安裝WKWebViewJavascriptBridge,通常通過CocoaPods安裝:
pod 'WKWebViewJavascriptBridge', '~> 1.0.0'
然后,可以在你的Objective-C代碼中這樣使用它:
#import
#import "WKWebViewJavascriptBridge.h"
@interface ViewController ()
@property (nonatomic, strong) WKWebView *webView;
@property (nonatomic, strong) WKWebViewJavascriptBridge *bridge;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 設(shè)置WebView
self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:self.webView];
// 初始化bridge
self.bridge = [WKWebViewJavascriptBridge bridgeForWebView:self.webView];
[self.bridge setWebViewDelegate:self];
// 注冊一個(gè)供JS調(diào)用的方法
[self.bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"testObjcCallback called: %@", data);
responseCallback(@"Response from testObjcCallback");
}];
// 調(diào)用JS的方法
[self.bridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" }];
// 加載頁面
NSURL *url = [NSURL URLWithString:@"https://example.com"];
[self.webView loadRequest:[NSURLRequest requestWithURL:url]];
}
@end
在你的HTML/JavaScript中,你也需要設(shè)置對應(yīng)的處理函數(shù)和調(diào)用:
// Connect to the Objective-C bridge
document.addEventListener('DOMContentLoaded', function() {
window.WebViewJavascriptBridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
console.log("ObjC called testJavascriptHandler with", data);
var responseData = { 'Javascript Says':'Right back atcha!' };
responseCallback(responseData);
});
});
這樣,就設(shè)置了一個(gè)雙向通信的橋,可以從JavaScript調(diào)用Objective-C代碼,也可以從Objective-C調(diào)用JavaScript代碼。
柚子快報(bào)激活碼778899分享:iOS原生與H5交互方法
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。