alert() 未从 Cordova InAppBrowser 事件侦听器中显示 - 与 Cordova window.alert 挂钩冲突

alert() not displayed from Cordova InAppBrowser event listener - Conflict w/ Cordova window.alert hook

使用 Cordova CLI 版本 5.4.1, 平台是iOS, 运行 在 iOS 模拟器上

从我的应用程序的 onDeviceReady 处理程序中,我正在调用一个函数来设置一个挂钩,以便使用本机对话框显示警报,如下所示:

overrideBrowserAlert: function() {
    if (navigator.notification) { // Override default HTML alert with native dialog
        window.alert = function (message) {
            navigator.notification.alert(
                message,    // message
                null,       // callback
                "MyAppTitle", // title
                'OK'        // buttonName
            );
        };
    }
},

大多数 alert 调用有效,但以下调用无效。

在某个阶段我会打开一个 InAppBrowser window。单击 "Done" 按钮时,它会成功关闭。我已经为事件 exit 注册了一个事件监听器,它做了两件事:

  1. alert("InAppBrowser window closed");
  2. Make an AJAX call, get some HTML from a remote server and show it in a <div> element

问题出在这里:AJAX 调用成功,但未显示 alert。这意味着 exit 事件已成功触发,仅 alert 调用有问题。

问题是这样解决的:猜测可能是范围或事件处理冲突,我注释掉了 window.alert 钩子的代码(即上面的 overrideBrowserAlert 调用),并且果然,InAppBrowser exit 事件处理程序中的警报有效。

我的问题是: 有谁知道如何解决这个冲突,以便 InAppBrowser exit 事件处理程序中的警报起作用并且 window.alert 挂钩也启用了?

谢谢!

这是 cordova-plugin-inappbrowser 上的错误

我已经填写了一个问题 https://issues.apache.org/jira/browse/CB-10855

您可以通过将关闭方法更改为

来修复它
- (void)close
{
    [CDVUserAgentUtil releaseLock:&_userAgentLockToken];
    self.currentURL = nil;

    __weak CDVInAppBrowserViewController* weakSelf = self;

    // Run later to avoid the "took a long time" log message.
    dispatch_async(dispatch_get_main_queue(), ^{
        if ([weakSelf respondsToSelector:@selector(presentingViewController)]) {
            [[weakSelf presentingViewController] dismissViewControllerAnimated:YES completion:^{
                if ((weakSelf.navigationDelegate != nil) && [weakSelf.navigationDelegate respondsToSelector:@selector(browserExit)]) {
                    [weakSelf.navigationDelegate browserExit];
                }
            }];
        } else {
            [[weakSelf parentViewController] dismissViewControllerAnimated:YES completion:nil];
        }
    });
}