在iOS开发中,使用Objective-C(OC)给H5静态链接传参数可以通过多种方式实现,主要包括通过URL Scheme、JavaScriptCore框架以及WKWebView的messageHandlers机制。以下详细说明如何实现这一功能:
1. 通过URL Scheme传递参数
步骤:
- 定义URL Scheme: 在H5页面中定义一个特定的URL Scheme,用于接收参数。
- 在OC中构造URL并加载: 在OC代码中构造包含参数的URL,并通过WebView加载该URL。
示例代码:
H5代码:
OC代码:
NSString *urlString = @"myapp://action?param1=value1¶m2=value2";
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
**解析URL参数:**在H5页面中,可以通过JavaScript解析URL参数。
function getQueryParams(url) {
var queryParams = {};
var queryString = url.split('?')[1];
var pairs = queryString.split('&');
for (var i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('=');
queryParams[pair[0]] = decodeURIComponent(pair[1]);
}
return queryParams;
}
var params = getQueryParams(window.location.href);
console.log(params.param1); // 输出: value1
console.log(params.param2); // 输出: value2
2. 使用JavaScriptCore框架传递参数
步骤:
- 获取JSContext: 在WebView加载完成后,获取JSContext。
- 定义OC方法并注入到JSContext: 在OC中定义方法,并将其注入到JSContext中。
- 在H5中调用OC方法: 在H5页面中通过JavaScript调用OC方法,并传递参数。
示例代码:
OC代码:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
context[@"ocMethod"] = ^void(NSString *param1, NSString *param2) {
NSLog(@"Received parameters: %@, %@", param1, param2);
};
}
// 或者使用WKWebView
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
[userContentController addScriptMessageHandler:self name:@"ocMethod"];
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = userContentController;
_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
[self.view addSubview:_webView];
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"ocMethod"]) {
NSArray *arguments = message.body;
NSString *param1 = arguments[0];
NSString *param2 = arguments[1];
NSLog(@"Received parameters: %@, %@", param1, param2);
}
}
H5代码:
// 对于UIWebView
ocMethod('value1', 'value2');
// 对于WKWebView
window.webkit.messageHandlers.ocMethod.postMessage(['value1', 'value2']);
3. 使用WKWebView的messageHandlers机制传递参数
步骤:
- 配置WKWebView: 创建WKWebViewConfiguration,并添加messageHandler。
- 在OC中实现messageHandler: 实现WKScriptMessageHandler协议,处理从H5传来的消息。
- 在H5中调用messageHandler: 在H5页面中通过JavaScript调用messageHandler,并传递参数。
示例代码:
OC代码:
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
[userContentController addScriptMessageHandler:self name:@"ocMethod"];
configuration.userContentController = userContentController;
_wkWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
[self.view addSubview:_wkWebView];
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"ocMethod"]) {
NSArray *arguments = message.body;
NSString *param1 = arguments[0];
NSString *param2 = arguments[1];
NSLog(@"Received parameters: %@, %@", param1, param2);
}
}
H5代码:
window.webkit.messageHandlers.ocMethod.postMessage(['value1', 'value2']);
总结
以上三种方法都可以实现OC向H5传递参数,具体选择哪种方法取决于项目需求和个人偏好。URL Scheme适用于简单的参数传递,JavaScriptCore和WKWebView的messageHandlers机制则提供了更强大的交互能力,支持更复杂的参数传递和方法调用。