4

我正在编写一个与 JS 网页协作的函数。我使用 UIWebView 来包含网页,然后当我希望网页与我的应用程序进行通信时情况变得复杂。

在 UIWebView 中调用 javascript 函数很容易使用该– stringByEvaluatingJavaScriptFromString:方法

但是有没有更简单的方法在网页中调用 obj-c 函数,使用 javascript?我尝试使用 UIWebView 委托方法,但我认为它太 hacky。

有什么建议吗?

4

3 回答 3

9

我想使用委托是您可以在 iOS WebView 中使用的唯一(一两个)方法。但是有几个包装器可以帮助您轻松解决问题。

  1. EasyJSWebView - 这复制了 Android 中的开发体验。在 Android 中,您可以简单地使用 WebView 中的 addJavascriptInterface() 方法将 Javascript 桥接到 Java。EasyJSWebView 提供了同步样式和异步样式来获取 Objective-C 方法的返回值。

  2. WebViewJavascriptBridge - 代码可能看起来有点像套接字编程。您可以在 Objective-C 中的“服务器”和 Javascript 中的“客户端”之间来回传递数据。

  3. GAJavaScript - 这可以提供更好的 DOM 操作体验。

看看所有这些,然后选择一个适合您需要的。

于 2013-01-22T09:29:07.487 回答
5

是的,它确实感觉很笨拙并且有点滞后,但是您需要使用 UIWebViewDelegate 来完成

function init()
{
  $('input').on('click', function(e) { answerBoxShouldBeginEditing(e); });
}

function answerBoxShouldBeginEditing(e)
{
  var object = e.toElement;

  var answer = $(object).attr('name');
  var request = 'engine:' + answer;

  var iframe = document.createElement('IFRAME');
  iframe.setAttribute('src', request);
  document.documentElement.appendChild(iframe);
  iframe.parentNode.removeChild(iframe);
  iframe = null;
}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
  NSString *requestString = [[request URL] absoluteString];
  if ([requestString hasPrefix:@"engine:"]) {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Hello" message:nil delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    return NO;
  }
  return YES;
}
于 2013-01-22T09:15:24.997 回答
0

如果您正在考虑升级到 WKWebView,XWebView可能是最好的解决方案。

于 2015-04-28T15:21:08.733 回答