2016-05-25 17 views
1

Gibt es eine Möglichkeit zu erkennen, ob auf Inhalte von eigenständigem Chrome oder in einer Webansicht (von einer Chrome-App) zugegriffen wurde? Z.B.Erkennen, ob Chrome Webview ist?

if(chromeapp) { 
    //content is in a webview/chromeapp 
} else { 
    //all other browsers 
} 

Kann jQuery sein ...

Edit: Ich bin ein Chrom-App zu entwickeln, die auf einen Inhalt verwalteten Website verbunden ist. In einer globalen js-Datei muss ich verschiedene Werte zurückgeben, abhängig davon, wo auf sie zugegriffen wird.

Wenn Desktop Rückkehr dieses ... Wenn iOS zurückkommen ... Wenn android etc ... Wenn Chrom App ...

Es ist eine gepackte Anwendung, die den Inhalt als <webview> einbettet.

{ 
    "manifest_version": 2, 
    "name": "...", 
    "short_name": "...", 
    "description": "...", 
    "version": "...", 
    "minimum_chrome_version": "38", 
    "default_locale": "en", 
    "icons": { 
    "16": "...", 
    "128": "...", 
    "192": "...", 
    "256": "...", 
    "384": "...", 
    "512": "..." 
    }, 
    "app": { 
    "background": { 
     "scripts": ["background.js"] 
    } 
    }, 
    "permissions": [ 
    "<all_urls>", 
    "storage", 
    "system.memory", 
    "system.network", 
    "unlimitedStorage", 
    {"fileSystem": ["write", "retainEntries", "directory"]}, 
    "webview", 
    "downloads", 
    "fullscreen" 
    ], 
    "webview" : { 
    "partitions": [{ 
     "name" : "trusted*", 
     "accessible_resources": ["<all_urls>"] 
    }] 
    }, 
    "sockets": { 
    "tcpServer" : { 
     "listen": ["*"] 
    } 
    } 
} 
+3

Können Sie Ihr Szenario besser erklären? Eine gehostete App? Eingebettet in ''? Ist die App unter Ihrer Kontrolle? Meinst du "Chrome-Browser" mit "Chrome App"? Warum brauchst du das? – Xan

+0

@Xan Entschuldigung. Siehe Bearbeiten. –

+0

Also welche Art von App hast du? Eine [gehostete App] (https://developer.chrome.com/webstore/get_started_simple) für die Website? Oder eine [verpackte App] (https://developer.chrome.com/apps/about_apps), die irgendwie JavaScript teilt? Oder eine gepackte App, die die Website [als ''] (https://developer.chrome.com/apps/tags/webview) einbettet? Oder eine [Progressive Web App] (https://developers.google.com/web/fundamentals/getting-started/your-first-progressive-web-app/)? Vielleicht ist es hilfreich, wenn Sie Ihr App-Manifest hinzufügen. – Xan

Antwort

2

Wenn die Webapp unter Ihrer Kontrolle ist es am besten wäre, den User-Agenten des Webapp zu ändern oder eine Variable in der URL übergeben, so dass Ihre Website weiß, dass es durch die Webapp zugegriffen wird.

Zum Beispiel: http://ww.mywebsite.com/?app=webview

+0

Mögliche Lösung. Aber ich muss möglicherweise den Inhalt mit dieser Lösung ändern, so dass es ein No-Go sein könnte. –

+0

Ich habe die User-Agent-Lösung für die Android-App meines eigenen webbasierten Spiels verwendet. Wenn die Website einen normalen Browser erkennt, erhalten Sie eine Benachrichtigung, dass es eine App gibt. Wenn die Website den App-User-Agent erkennt, werden Sie zum Spiel weitergeleitet. Soweit ich weiß, war das dann (vor ca. 2 Jahren) die beste Lösung. – s1h4d0w

1

Die einfachste Sie tun können, ist für Ihre <webview> User-Agent außer Kraft setzen.

// App window code 
webviewElement.setUserAgentOverride(
    navigator.userAgent + " HeyItsMyApp/" + chrome.runtime.getManifest().version 
); 
webviewElement.src = "https://example.com"; // Initiate navigation 

// webpage code 
if (navigator.userAgent.indexOf("HeyItsMyApp") >= 0) { 
    // It's embedded in our app 
} 

Alternativ können Sie für eine bekannte Datei in Ihrer Anwendung dank accessible_resources testen (die Sie gerade Missbrauch, wie es Spielmuster für die Webansicht Inhalt keine Liste ist, sondern eine Liste von Mustern für Dateien in Ihrer Erweiterung). Zum Beispiel ist hello.txt unter der Annahme in Ihrer Erweiterung:

"webview" : { 
    "partitions": [{ 
    "name" : "trusted*", 
    "accessible_resources": ["hello.txt"] 
    }] 
}, 

Dann in Ihrer Webseite, die Sie Laden versuchen chrome-extension://youridhere/hello.txt - es wird nur innerhalb der App erfolgreich zu sein.

Dies könnte eine manipulationssicherere Lösung sein, obwohl nichts vollständig manipulationssicher ist.


Als weitere Alternative können Sie einen Content-Skript injizieren, die die Seite zu informieren, zu verstehen ist, dass es eingebettet ist, vielleicht von einem unsichtbaren DOM-Elemente hinzugefügt wird.

+0

Gute Idee, aber ich kann nicht scheinen, um den Agenten zu setzen. Keine Fehler, und ich setze das auf ** createdWindow ** –

+0

Sie müssen Code (separate Frage?) Zeigen, aber bedenken Sie, dass Ihr Webview es haben sollte "src" zunächst deaktiviert, um meinen Code zu verwenden. – Xan

+0

Ich sehe .. Ich muss heute später darauf zurückkommen. –