3

我使用Cordova 的InAppBrowser插件,我想从我的应用程序(Android、iOS)打开一个网页。但是,网站应该知道用户是通过移动浏览器还是通过我的应用程序进入的。

我虽然从我的应用程序更改用户代理将能够工作。有没有类似的解决方案?

我想在我打开一个新窗口之前,我应该定义用户已经通过我的应用程序进入了网站。

window.open("http://test.example.com", "_blank", "location=no");
4

2 回答 2

2

当然,你可以这样做:

window.open("http://test.example.com?entry=app","_blank","location=no");
// see how we added ?entry=app query string?

然后在您正在打开的网页的 JavaScript 中的某个位置,只需解析“entry”参数并根据 entry 的值执行您想要执行的任何特定操作。

如果您想在多个页面上使用此逻辑,您可能需要设置一些 cookie 或其他内容,因为如果他们单击 InAppBrowser 中的链接,它将丢失?entry=app查询字符串。

我想您可以尝试在他们每次单击 InAppBrowser 中的新链接时使用addEventListener("loadstart",fn). 这样,fn每次用户单击新页面时都会调用该函数,在这里您可以重写 URL。它可能是这样的:

var ref = window.open("http://test.example.com?entry=app", "_blank", "location=no");
ref.addEventListener("loadstart", IABcallback);

function IABcallback(event){
    if( event.url.substr(event.url.search(/entry/, '')) === "entry=app"){
        // This is a lazy check for "entry" paramater, you should use a library or something
        console.log("already have entry=app query string");
    }else{
        // open a new window with the same URL but add ?entry=app
        ref = window.open(event.url+"?entry=app", "_blank", "location=yes");
        // reattach this event listener since it is a new window
        ref.addEventListener("loadstart", IABcallback);
    }
}

这工作“没问题”。主要问题是每次点击当前窗口顶部的链接时,它都会打开一个新的 InAppBrowser 窗口,从而使后退按钮无法使用。您可以尝试通过ref.close()关闭窗口然后重新打开它来解决这个问题,但是我在让它工作时遇到了问题。我还尝试为窗口使用自定义名称(而不是“_blank”),但这也不起作用。所以,很抱歉这是一个不完整的答案,但希望它能给你一些想法。使用自定义查询字符串初始加载应用程序然后记住您来自 InAppBrowser 通过 localStorage 或 cookie 或其他东西可能会容易得多。

于 2013-04-30T20:41:06.777 回答
0

在 Ios 中,inappbrowser 创建 iframe。因此,您可以检查是否在您的 html 中创建了 iframe,这意味着它是一个 inappbrowser,否则它是一个普通的移动浏览器。

if(document.getElementById("_cdvIframeBridge")){ 
 alert('its an inappbrowser')
 }else{ 
 alert('its a mobile browser') 
}

于 2018-04-28T07:43:44.470 回答