在iOS开发中,使用Objective-C(OC)爬取Web页面调用的接口,通常涉及到OC与JavaScript(JS)之间的交互。以下是几种常见的实现方法:
1. 通过WebView代理截取网页按钮调用本地代码
通过设置WebView的代理,可以监听网页加载过程中的URL请求,当URL以特定前缀(如"baixun://")开头时,截取后缀作为方法名,调用本地方法实现相应功能。例如,将HTML中的按钮链接修改为"baixun://backuptoindex",即可在网页按钮点击时调用本地方法。
2. 通过JavaScript实现网页与OC交互
- 拦截按钮点击事件:与上述方法类似,但通过JavaScript直接监听并响应网页按钮的点击事件。
- 直接调用方法:将本地代码封装成函数,通过JavaScript调用并传递参数,实现更简单的交互。
- 通过对象调用方法:使用JSExport协议,允许JavaScript调用OC类中的方法。通过创建实现JSExport协议的类,可以定义方法和变量供JavaScript访问。例如,定义一个类TestJSObject,实现TestJSObjectProtocol协议,其中包含不同参数数量的方法,通过JavaScript调用这些方法,传递参数。
3. 使用WKWebView的MessageHandler
WKWebView提供了更现代和高效的方式来进行JS与OC的交互。具体步骤如下:
-
在OC端注册方法给JS调用:
self.webConfig = [[WKWebViewConfiguration alloc] init];
self.wkwebview = [[WKWebView alloc] initWithFrame:CGRectZero configuration:self.webConfig];
// 提供方法给js调用
[self.webConfig.userContentController addScriptMessageHandler:self name:@"gotoActive"];
-
JS调用OC方法传值:
window.webkit.messageHandlers.gotoActive.postMessage({'key': 'value'});
其中gotoActive是OC与JS约定好的方法名,括号里就是写JS给OC传的值,可以传数组、字符串、字典等。
4. 使用WebViewJavascriptBridge
WebViewJavascriptBridge是一个流行的第三方库,简化了JS与OC之间的交互过程。具体步骤如下:
-
OC端注册方法:
[bridge registerHandler:@"callme" handler:^(id data, WVJBResponseCallback responseCallback) {
NSLog(@"OC端 得到 %@", data);
responseCallback(@"Response from OC");
}];
-
JS端调用OC方法:
bridge.callHandler('callme', {'blogURL': 'github.com/maying1992 '}, function(response) {
console.log('JS端 得到 response', response);
});
-
OC调用JS方法:
[self.bridge callHandler:@"factorial" data:@(10) responseCallback:^(id responseData) {
NSLog(@"OC端得到回调 responseData: %@", responseData);
}];
-
JS端注册方法供OC调用:
bridge.registerHandler('openWebviewBridge', function() {
console.log("openWebviewBridge was called with by ObjC");
});
OC端调用:
[self.bridge callHandler:@"openWebviewBridge" data:nil];
通过以上代码实现了OC与JS的双向调用。
5. 使用JavaScriptCore框架
JavaScriptCore框架允许OC直接执行JS代码,并且可以将OC对象暴露给JS环境。具体步骤如下:
-
创建JSContext对象:
JSContext *context = [[self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"] retain];
-
将OC对象添加到JSContext中:
context[@"myObject"] = self;
-
在JS中调用OC方法:
myObject.myMethod();
这种方式适用于iOS 7及以上版本。
总结
以上方法各有优缺点,选择哪种方法取决于具体的应用场景和需求。对于现代应用开发,推荐使用WKWebView的MessageHandler或WebViewJavascriptBridge,因为它们提供了更简洁和高效的方式来实现JS与OC的交互。