TL;DR;
Google's new AR animals appear as if they are AR on the web (like AR.js or 8thWall), but are actually native ARCore applications. The sleight of hand is that a link in a browser (actually a button with a very obfuscated event handler chain) launches the ARCore app itself without any prompt for the user to install anything. How does Google do this? I want to do it too.
Detail
Recently Google introduced a search feature that allows users to view animals in AR by clicking a link from a search info card.
This is true plane-sensing, SLAM-tracking AR, no markers required. Viewing examples on my own phone (Pixel 2 running Android 9), the location and angle fidelity is impressive. I can move the phone around, walk around, and the tiger's foot (for example) stays anchored within a few inches. Likewise the AR objects have excellent visual stability, avoiding the shake that plagues most of the marker-based AR.js apps I've seen, or the mediocre object anchoring I see in 8th Wall's non-marker examples.
As a developer working on AR delivered over the web, I'm mighty curious how they pulled off such a high-quality result. Do they have far superior proprietary tech they're not sharing with the THREE.js / ARKit / AR.js open source projects?
No. Debugging into the the tiger example using USB remote inspection of my phone from my laptop, plus some circumstantial clues, I've concluded that they look so good because they are not web AR, but native AR using ARCore. Somehow Google causes the user's phone to load a native ARCore application (system logs make it appear is ARCore itself is being launched as an application) without any install prompt. Attempting to switch to another app causes the AR app to automatically close, making it difficult to debug or inspect it.
Google's own ARCore docs generally imply that you need to publish an app to the Play store to actually get ARCore enabled software into the hands of users. So, does anyone know how Google does what they're doing here?
All images are my original work
Info card link:
Prompt to grant app permissions to ARCore:
ARCore was just used: