             }
         }
         webViewObservation = nil
-        NotificationCenter.default.removeObserver(self)
-    }
-
-    /// Track url requests change in order to reset adView and position tracking
-    /// When position is located a new time, alert through ``TeadsWebViewHelperDelegate/webViewHelperSlotFoundSuccessfully()``
-    override public func observeValue(forKeyPath keyPath: String?, of _: Any?, change: [NSKeyValueChangeKey: Any]?, context _: UnsafeMutableRawPointer?) {
-        if keyPath == Self.urlKeyPath,
-           let _ = change?[NSKeyValueChangeKey.newKey] {
-            adView?.removeFromSuperview()
-            containerView?.removeFromSuperview()
-            slotPosition = nil
-        }
     }
 
     /// Inject Teads' bootstrap in the webview

    private var slotOpener: (() -> Void)?
    private var slotOpportunity: ((WKWebView, SlotPosition) -> Void)?

    private static let urlKeyPath = NSExpression(forKeyPath: \WKWebView.url).keyPath

    /// Init the Teads webView helper
    ///
    /// Handles slot position injection from TeadsSDK

        self.delegate = delegate
        super.init()

        /// Track url requests change in order to reset adView and position tracking
        /// When position is located a new time, alert through ``TeadsWebViewHelperDelegate/webViewHelperSlotFoundSuccessfully()``
        webViewObservation = webView.observe(\.url, options: [.old, .new]) { [weak self] _, changes in
            if changes.oldValue != changes.newValue {
                self?.adView?.removeFromSuperview()
                self?.containerView?.removeFromSuperview()
                self?.slotPosition = nil
            }
        }

        // add message handler method name to communicate with the wkwebview
        JSBootstrapOutput.allCases.map(\.rawValue).forEach {
