UPI intent from iOS WKWebView

I am trying to open UPI apps from swift WKWebView.

I have tried it using adding openURL into other application if its not http or https.

Here is the strategy I am following. AppDelegate class

import Foundation
import UIKit
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
        return true

Here is the Webview navigation delegate function

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        currentWebView = webView
        guard let url = navigationAction.request.url else {
        print("NavAction URL: \(url)")
        if navigationAction.targetFrame == nil {
            // Open in the same tab if the target frame is nil (new tab)
            print("NavAction 1")
        else if let url = navigationAction.request.url,
           UIApplication.shared.canOpenURL(url) {
            // Have UIApplication handle the url (sms:, tel:, mailto:, ...)
  , options: [:], completionHandler: nil)
            // Cancel the request (handled by UIApplication).

How can I open the UPI apps the way safari opens them with a dialog saying Open in "GPay".


  • You can use a custom URL scheme that is registered by UPI apps. UPI apps typically have URL schemes that you can use to initiate payment requests. Here's how you can do it:

    • Find the URL scheme of the UPI app you want to open. Popular UPI apps like Google Pay, PhonePe, or PayTM have their custom URL schemes.

    • Once you have the URL scheme, you can create a link with that scheme and the necessary UPI parameters. For example, to open Google Pay:

      let upiURLString = "upi://pay?pa=recipient@upi&pn=Recipient Name&mc=1234&tid=123456&tr=12345678&am=100&cu=INR"

    Here's what each parameter means:

    pa: Payee VPA (Virtual Payment Address) pn: Payee name mc: Merchant code (if applicable) tid: Transaction ID tr: Transaction reference ID am: Amount cu: Currency code (e.g., INR for Indian Rupees)

    • Check if the UPI app is installed and open the URL using

      if let upiAppURL = URL(string: upiURLString) { if UIApplication.shared.canOpenURL(upiAppURL) {, options: [:], completionHandler: nil) } else { // Handle the case where the UPI app is not installed // You may want to provide a fallback option or notify the user } }

    You should place this code in the appropriate event handler in your WKWebView, such as when a button or link is clicked. You can also listen for navigation events in the WKNavigationDelegate to detect when a specific link is clicked and then trigger this action accordingly.