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

Posted

技术标签:

【中文标题】iOS:在 UIWebview 中使用 javascript 调用 obj-c 方法【英文标题】:iOS: call obj-c methods using javascript in a UIWebview 【发布时间】:2013-01-22 09:09:14 【问题描述】:

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

使用– stringByEvaluatingjavascriptFromString: 方法可以很容易地在 UIWebView 中调用 javascript 函数

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

有什么建议吗?

【问题讨论】:

【参考方案1】:

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

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

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

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

查看所有这些并选择一个适合您需要的。

【讨论】:

啊这就是我一直在寻找的。我知道没有其他方法可以实现这一点,但包装器绝对有帮助。谢谢! EasyJSWebView 真的很棒!它完全可以满足您的需要。向杜克兰的帅哥们干杯。谢谢!【参考方案2】:

是的,它确实感觉很笨拙并且有点滞后,但您需要使用 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;

【讨论】:

太棒了!另一种方式 - 提出 XHR 请求。两种方法都在“cordova/exec”模块(js部分)github.com/phonegap/phonegap/blob/master/lib/ios/CordovaLib/…中实现 嗨,在使用 iframe 时我遇到了这个问题,请参阅我的问题***.com/q/43867801/3378413【参考方案3】:

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

【讨论】:

以上是关于iOS:在 UIWebview 中使用 javascript 调用 obj-c 方法的主要内容,如果未能解决你的问题,请参考以下文章

swift 笔记:iOS与JavaScript的交互(一):UIWebView - 2.1直接使用字符串通过评估Java脚本(来自:)

使用swift在ios的Uiwebview中添加参数

位置服务在 iOS10 中无法与 UIWebView 一起使用

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

如何在 iOS 中使用 UIWebView 从 url 修改内容加载?

reCAPTCHA 在 iOS 10 UIWebView 中不起作用