iOS:在UIWebview中使用javascript调用obj-c方法

时间:2013-01-22 09:09:14

标签: javascript iphone ios objective-c xcode

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

使用– stringByEvaluatingJavaScriptFromString:方法

可以轻松调用UIWebView中的javascript函数

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

有什么建议吗?

3 个答案:

答案 0 :(得分:9)

我猜使用委托是您可以在iOS WebView中使用的唯一(一个或两个)方法。但有几个包装可以帮助你轻松。

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

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

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

  4. 看看所有这些并选择一个符合您需求的产品。

答案 1 :(得分:5)

是的,确实感觉很hacky并且有点滞后但你需要用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;
}

答案 2 :(得分:0)

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