web-dev-qa-db-ja.com

IOSのUIWebview内でボタンクリックをインターセプトする方法は?

UIWebview内で開いている特定のフィールドを持つHTMLフォームがあります。特定のボタンをクリックすると、アプリ内アクションを実行します。

現在使用しているアプローチは、ボタンをクリックしてページをダミーURLにリダイレクトすることです。デリゲートメソッド「shouldStartLoadWithRequest」を使用してURLをスニッフィングし、リダイレクトを停止します。その後、カスタムイベント(画像のキャプチャとアップロード)を行ってから続行します。これはいハックのようです。とにかく、ページリダイレクトではなくボタンクリックイベントに直接フックできますか?

[〜#〜] update [〜#〜]ボタンのクリックでJS関数が呼び出されたときに起動するデリゲートメソッドを設定する方法がないようです。これを行う唯一の方法は、上記のURLスニッフィング方法を使用することです。これは以下のjoernによって詳細に説明されているので、彼の答えを受け入れます。

31
B K

次のことができます。

あなたの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に「キャプチャ」を追加して、異なるアクションをトリガーする複数のボタンを区別できるようにしました(必要な場合)。

59
joern

このコード:

<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で動作します。

3
Malder

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
}
0
akonoplev