window.open() 仅在 IOS 的异步函数中不起作用

问题描述 投票:0回答:1

我开发了一个

ReactJS
应用程序,它嵌入在
webview
中,适用于 android 和 ios。

我有一个重定向到新网站的按钮。如果第一次点击这个按钮,会触发api调用然后使用

window.open
进行重定向,如果第二次点击则不会触发api调用,直接应用重定向。

这是代码

    let windowReference = window.open("", "_blank");
  //first time
  if (reward == null) {
       let resp = await activate();
       if (resp.ok) {
            if (windowReference == null || windowReference.closed) {
                window.open(myUrl, "_blank");
            } else {
                windowReference.location = myUrl; 
            }
       }
  } else {
       //second time
      if (windowReference == null || windowReference.closed) {
                window.open(myUrl, "_blank");
            } else {
                windowReference.location = myUrl; 
            }
  }

此代码在

android webview
browser
上运行良好,但在
ios webview
中,第一次它什么都不做,但第二次单击导航到 myUrl 就好了。

我试过的东西是

  1. 将逻辑放在异步响应中
    setTimeout
  2. 改变
    _blank
    _self

还是没有变化

有什么我想念的吗?

如果你能帮忙,请告诉我。

javascript ios webview
1个回答
0
投票

我认为问题是默认情况下 IOS Safari 与其他浏览器相比有严格的弹出窗口阻止程序,这可能会阻止它打开新窗口。

要解决此问题,您可以响应用户的手势打开窗口。您也可以尝试在异步调用的单独函数中打开新窗口,但不在异步函数中。

例子:

function handleOpenNewWindow() {
let windowReference = window.open("", "_blank");
if (windowReference == null || windowReference.closed) {
  window.open(myUrl, "_blank");
} else {
windowReference.location = myUrl;
 }
}
 //---  call handleOpenNewWindow() asynchronously here ---
 let resp = await activate();
 if (resp.ok) {
 setTimeout(handleOpenNewWindow, 0);
 }
© www.soinside.com 2019 - 2024. All rights reserved.