iOS 开发 oc 如何给h5静态链接传参数

197 阅读2分钟

在iOS开发中,使用Objective-C(OC)给H5静态链接传参数可以通过多种方式实现,主要包括通过URL Scheme、JavaScriptCore框架以及WKWebView的messageHandlers机制。以下详细说明如何实现这一功能:

1. 通过URL Scheme传递参数

步骤:

  1. 定义URL Scheme: 在H5页面中定义一个特定的URL Scheme,用于接收参数。
  2. 在OC中构造URL并加载: 在OC代码中构造包含参数的URL,并通过WebView加载该URL。

示例代码:

H5代码:

点击这里

OC代码:

NSString *urlString = @"myapp://action?param1=value1&param2=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框架传递参数

步骤:

  1. 获取JSContext: 在WebView加载完成后,获取JSContext。
  2. 定义OC方法并注入到JSContext: 在OC中定义方法,并将其注入到JSContext中。
  3. 在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机制传递参数

步骤:

  1. 配置WKWebView: 创建WKWebViewConfiguration,并添加messageHandler。
  2. 在OC中实现messageHandler: 实现WKScriptMessageHandler协议,处理从H5传来的消息。
  3. 在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机制则提供了更强大的交互能力,支持更复杂的参数传递和方法调用。