Bijgewerkt op 18. mei 2023 door Jan Bunk
Sommige websites of websitefuncties werken alleen in vertrouwde browser omgevingen. Een WebView zoals je app die gebruikt om je website weer te geven wordt niet als vertrouwd beschouwd. Dat komt omdat de functies die we gebruiken om je een visueel aantrekkelijke en aanpasbare app te bieden, voor snode doeleinden misbruikt kunnen worden. Uiteraard voeren onze apps zulke snode acties niet uit of staan ze niet toe, maar sommige websites beperken alle WebViews vanwege dit theoretische risico.
Om dat te vermijden kun je delen van je website, die niet in WebViews werken, openen in zogenaamde aangepaste tabbladen.
Als je website een 'Inloggen met Google' (of Apple, Facebook, Twitter, enz.) functie biedt, werkt die misschien alleen in een aangepast tabblad. Facebook geeft duidelijk aan dat inloggen in WebViews niet is toegestaan, terwijl sommige andere gewoon niet werken.
Hier zie je 2 schermafdrukken van onze Android app, zodat je het verschil kunt zien tussen het openen van een pagina in de app en in een aangepast tabblad.
executeWhenAppReady()
functie van ons app-helper script. Het zorgt ervoor dat je website niet probeert te communiceren met de app voordat deze klaar is of wanneer je website wordt geladen met een gewone browser (ReferenceError, functie is niet gedefinieerd).
<script>
openCustomTab("https://webtoapp.design/user/login", {
"myFirstValue": "abc",
"myNumbers": "123"
});
</script>
<script>
if (isInCustomTab()) {
// continue with the next steps...
}
</script>
<script>
// this is the data you passed as a second parameter to openCustomTab, so in our example from above:
// {
// "myFirstValue": "abc",
// "myNumbers": "123"
// }
let myData = getCustomTabData();
</script>
<script>
closeCustomTab({
"somedata": "mydata",
"moredata": {
"test": "myvalue"
}
})
</script>
<script>
document.addEventListener("customTabClosed", function (e) {
if ("reason" in e.detail) {
// currently only supports the reason "closed manually"
console.log("The custom tab was " + e.detail.reason);
}
else {
// the custom tab was closed by the website javascript
// this is the data you passed to closeCustomTab, so in our example from above:
// {
// "somedata": "mydata",
// "moredata": {
// "test": "myvalue"
// }
let returnedData = e.detail;
}
});
</script>
Hier volgen enkele voorbeelden over hoe je een inlogproces met aangepaste tabbladen kunt implementeren.
Het grootste probleem is steeds dat we de gebruiker willen laten inloggen in de app (want dat wil de gebruiker gebruiken), maar dat hij zijn inloggegevens moet invoeren in de aangepaste tab, die aparte cookies heeft (waarin je meestal opslaat of iemand ingelogd is).
Dit is waarschijnlijk de eenvoudigste manier om in te loggen met een aangepast tabblad. Denk eraan de cookies die naar de app moeten niet als HttpOnly in te stellen, want HttpOnly cookies kunnen niet via JavaScript geopend worden.
Open diagram in nieuw vensterDeze aanmeldmethode is ingewikkelder maar flexibeler, dus kan het de voorkeur hebben, afhankelijk van je gebruikssituatie.
Open diagram in nieuw vensterPagina's die in een aangepast tabblad geladen worden gedragen zich alsof ze in de browser van de gebruiker geladen zijn, wat betekent dat app-specifieke functies niet werken, bijvoorbeeld:
getAppPlatform
executeWhenAppReady
- Maar dat is geen probleem, alle app-helperfuncties voor het omgaan met aangepaste tabbladen hoeven niet te wachten tot de app klaar is.