【问题标题】:WKWebView addEventListener not receiving Calendly eventsWKWebView addEventListener 没有收到日历事件
【发布时间】:2021-09-01 15:54:29
【问题描述】:

我正在尝试在 WKWebView 中使用 Calendly,并在用户创建约会时接收事件。应用已成功接收message 事件,但没有出现日历事件。

代码如下:

import UIKit
import WebKit

class ViewController: UIViewController, WKScriptMessageHandler {
    
    var webView: WKWebView!
    var count = 0
    
    var html = """
    <html>
    <head>
        <meta name='viewport' content='width=device-width' />
    </head>
    
    <!-- Calendly inline widget begin -->
    
    <div class="calendly-inline-widget" data-auto-load="false">
        <script type="text/javascript" src="https://assets.calendly.com/assets/external/widget.js"></script>
        <script>
        Calendly.initInlineWidget({
            url: 'https://calendly.com/XXX',
            prefill: {
                name: "John Doe",
                email: "john@joe2.com",
                customAnswers: {
                    a1: "yes"
                }
            }
        });
        </script>
    </div>
    <!-- Calendly inline widget end -->
    </html>
    """

    override func viewDidLoad() {
        let config = WKWebViewConfiguration()
        let js =

        """
        function isCalendlyEvent(e) {
          return e.data.event &&
                 e.data.event.indexOf('calendly') === 0;
        };
         
        window.addEventListener(
          'message',
          function(e) {
            if (isCalendlyEvent(e)) {
              console.log("!!!!!!!!!!!!!!!!!!!!!!!!!!!");
              console.log(e.data);
            }
          }
        );
        
        function isCalendlyEvent(e) {
                  console.log('testing' + e.name);
                  return e.data.event &&
                         e.data.event.indexOf('calendly') === 0;
                };
        window.addEventListener('message', function(e){
            console.log('In listener. Event.type: ' + event.type +
                ' e.data.event: ' + e.data.event + ' event: ' + JSON.stringify(e.data));
            if (isCalendlyEvent(e)) {
                console.log('calendly event!!!!');
                window.webkit.messageHandlers.clickListener.postMessage('Calendly:' + e.data);
            } else {
                window.webkit.messageHandlers.clickListener.postMessage('Other:' + e.data);
            }
        });
        """

        let script = WKUserScript(source: js, injectionTime: .atDocumentEnd, forMainFrameOnly: false)

        config.userContentController.addUserScript(script)
        config.userContentController.add(self, name: "clickListener")

        webView = WKWebView(frame: view.bounds, configuration: config)

        view.addSubview(webView!)
        self.webView.loadHTMLString(self.html, baseURL: nil)
    }
    
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        count = count + 1
        print("Msg \(count): \(message.body) ")
    }
}

【问题讨论】:

    标签: wkwebview addeventlistener calendly


    【解决方案1】:

    只有当url包含embed_domain查询参数时才会发送calendly消息。在 WKWebView 内部调用 Calendly.initInlineWidget 时,embed_domain 查询参数设置为 undefined。

    要解决此问题,您可以更新 url 以包含 embed_domain 参数:

    Calendly.initInlineWidget({
                url: 'https://calendly.com/XXX?embed_domain=example',
                prefill: {
                    name: "John Doe",
                    email: "john@joe2.com",
                    customAnswers: {
                        a1: "yes"
                    }
                }
            });
    

    【讨论】:

    • 我认为你在正确的轨道上。解决了。我必须在loadHTMLString(self.html, baseURL: nil) 中指定我们的域。据推测,配置我们的 Calendly 帐户设置了域,我没有意识到 Calendly 正在检查。
    猜你喜欢
    • 2023-02-02
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多