Skip to content

feat: Can not react to WKNavigationDelegate in Plugin #2349

Open
@ghost

Description

This issue is related to developing ios plugins.

Issue description:
CAPBridgeViewController is WKNavigationDelegate so no other plugins can be a delegate for navigation of the webview.

Reacting to important WKWebview navigation events like:

  • didFinish
  • didStartProvisionalNavigation
  • didFailProvisionalNavigation
    ...

Is now impossible in a plugin since CAPBridgeViewController is already the WKNavigationDelegate.

I wanted to write a plugin like this (I actually had 2 finished):

@objc(SomePlugin)
public class SomePlugin: CAPPlugin, WKNavigationDelegate {
    
    public override func load() {
        self.bridge.getWebView()?.navigationDelegate = self
    }
    
    public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        // Do some logic
    }

   // Other WKNavigationDelegate protocol methods
}

Proposed solutions:
Solution 1:
Implement all functions of the WKNavigationDelegate and let them send a notifcation we can subscribe to in our plugins.

Refering to line 220 in CAPBridgeViewController:

public func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    // Reset the bridge on each navigation
    bridge!.reset()
   NotificationCenter.default.post(name: .didStartProvisionalNavigation, object: nil)
  }
```

**Solution 2:**
Implement multiple custom delegation pattern in CAPBridgeViewController

**Solution 3:**
Allow us to use callbacks
[https://medium.cobeisfresh.com/why-you-shouldn-t-use-delegates-in-swift-7ef808a7f16b](https://medium.cobeisfresh.com/why-you-shouldn-t-use-delegates-in-swift-7ef808a7f16b)


I am happy to start a PullRequest with any of these solutions. We need this. We use multiple apps and they are hosted remotely.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions