如何在iOS上拦截UIWebview中的按钮点击?

32

我有一个HTML表单,其中包含一些字段,我正在UIWebview中打开这些字段。在特定按钮的点击上,我想执行一个应用程序内操作。

我现在使用的方法是,在按钮点击时,将页面重定向到虚拟URL。我使用委托方法“shouldStartLoadWithRequest”嗅探URL并停止重定向。然后我执行自定义事件(捕获图像并上传),然后继续。这似乎是一个丑陋的hack。是否有办法直接钩入按钮点击事件而不是页面重定向?

更新 似乎没有办法设置委托方法在按钮点击时触发JS函数。唯一的方法是使用上述URL嗅探方法。Joern已经详细解释了这一点,因此我会接受他的答案。

3个回答

65
你可以这样做:
在你的HTML中。
<a class="yourButton" href="inapp://capture">Button Text</a>
在你的UIWebViewDelegate中。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
   if ([request.URL.scheme isEqualToString:@"inapp"]) {
      if ([request.URL.host isEqualToString:@"capture"]) {
         // do capture action
      }  
      return NO;
   }  
   return YES;
}

我在你的按钮URL中添加了"capture",这样你就可以区分多个按钮并触发不同的操作(如果需要):


1
是的,这就是我已经在使用的方法。有没有办法通过代码向按钮添加一个动作?我想这可能由于沙盒机制而不可能,但只是想确认一下。 - B K
1
请问您所说的“action”是什么意思,能否澄清一下? - joern
请问 @joern,我在我的 UIWebView 中有一个普通的表单。该表单有一个普通的 HTML “提交”按钮。我想让这个 HTML 提交按钮实际上提交表单,并且我想在 iOS 应用程序中捕获点击事件。这是否可能?感谢您的回答! - Fattie
1
@JoeBlow 没问题;-) 你可以像上面描述的那样拦截提交按钮的点击事件,然后用你HTML中调用表单提交的JavaScript函数替换// do capture action注释。 - joern
2
哦,等一下。在上面的例子中,只需在捕获操作后返回“YES”,而不是“NO”。然后表单将正常提交,就好像什么都没有发生一样。无需调用JavaScript函数。 - joern
显示剩余9条评论

3
这段代码:
<a class="yourButton" href="inapp://capture">Restart</a>

对我不起作用。

我在我的javascript代码中添加了"inapp://capture"事件函数。

KeyboardInputManager.prototype.restart = function (event) {
  window.location.href = "inapp://capture";
  //other code
};

我使用UIWebViewDelegate,适用于iOS 8和9。


1

针对 Swift 4.2

HTML 代码中的按钮:

<a class="catch-iOS" href="inapp://home">Продолжить покупки</a>

UIWebViewDelegate方法:
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebView.NavigationType) -> Bool {
    if request.url?.scheme == "inapp" {
        if request.url?.host == "home" {
            // do something
        }
    }
    return true
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接