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

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

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

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

有什么建议吗?

【问题讨论】:

    标签: javascript iphone ios objective-c xcode


    【解决方案1】:

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

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

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

    3. 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;
    }
    

    【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      相关资源
      最近更新 更多