Sådan åbner man en dApp i Solana-mobilwallets
En React-dApp bygget på @solana/wallet-adapter-react forbinder
desktop-wallets uden problemer, men på en telefon falder det samme flow fra
hinanden: wallet’en skal åbne dApp’en i sin egen indbyggede browser, og de
deeplinks, der skulle klare det, virker bare ikke. Backpack lander på en “hent
appen”-side; Solflare åbner appen, men aldrig sitet; alle varianter ser ud til
at fejle. Vi skilte problemet ad, og det viste sig at være fire adskilte
problemer med ét fælles symptom.
De fire problemer
- Backpack-linket var forkert bygget. Det eneste dokumenterede format er
https://backpack.app/ul/v1/browse/<url>?ref=<ref>— et universelt link med mål-URL’en i stien og et påkrævetref. Et gæt med eget skema sombackpack://ul/v1/browse?url=...matcher ingen rute i appen, så brugeren ender på wallet’ens installationsside. - Solflare skal også bruge sit universelle link:
https://solflare.com/ul/v1/browse/<url>?ref=<ref>— ikke det råsolflare://-skema. Et råt skema kan starte appen uden at dirigere den — hvilket er præcis “appen åbner, men site-fanen må åbnes med hånden”. - Begge parametre skal være kodet.
urler dApp’ens fulde absolutte adresse, ogrefer den kaldende origin, hver især gennemencodeURIComponent. Et ukodet?eller&i målet ødelægger fortolkningen, og wallet’en åbner på sin forside i stedet for browserfanen. - Udløsningen betyder lige så meget som linket. Universelle links skifter kun app ved en navigation, styresystemet stoler på — og de gør med vilje ingenting, når de indsættes i adresselinjen, hvilket også er sådan, et helt korrekt link “fejler” under test.
De dokumenterede formater
- Phantom:
https://phantom.app/ul/browse/<url>?ref=<ref>— uden/v1i netop dette. - Solflare:
https://solflare.com/ul/v1/browse/<url>?ref=<ref> - Backpack:
https://backpack.app/ul/v1/browse/<url>?ref=<ref>
Ét mønster dækker alle tre:
const WALLET_BROWSE = {
phantom: (url, ref) =>
`https://phantom.app/ul/browse/${url}?ref=${ref}`,
solflare: (url, ref) =>
`https://solflare.com/ul/v1/browse/${url}?ref=${ref}`,
backpack: (url, ref) =>
`https://backpack.app/ul/v1/browse/${url}?ref=${ref}`,
};
function walletBrowseLink(
walletName,
targetUrl = window.location.href,
) {
const build = WALLET_BROWSE[walletName.toLowerCase()];
if (!build) return null;
return build(
encodeURIComponent(targetUrl),
encodeURIComponent(window.location.origin),
);
}
Udløs linket, så iOS og Android accepterer det
- Render et rigtigt anker, beregnet på forhånd. Et almindeligt
<a href={walletBrowseLink('phantom')}>er den mest pålidelige udløser på begge platforme. - Skal det ske programmatisk, så tildel
window.location.hrefsynkront inde i tryk-handleren — ingenawait, ingenfetch, ingensetTimeoutførst. Efter asynkront arbejde er gestus-konteksten væk, og iOS falder tilbage til wallet’ens websted. Aldrigwindow.open. - Test aldrig ved at indsætte i adresselinjen. Universelle links udløses med vilje ikke dér; test med et link, der trykkes på, eller en QR-kode, som kameraet scanner.
- Pas på messenger-webviews. Åbnet i Telegrams eller Instagrams indbyggede browser bliver universelle links ofte slugt, og wallet’ens almindelige websted indlæses i stedet. User-agent-detektion er i bedste fald et gæt, så giv også brugerne en synlig nødudgang: “åbn i Safari eller Chrome, og forbind derefter”.
Den større løsning på Android
Håndbyggede deeplinks er iOS-historien. På Android lader Solana Mobiles Mobile
Wallet Adapter en dApp i mobilbrowseren forbinde direkte til den installerede
wallet-app, helt uden omvejen om den indbyggede browser. Nyere versioner af
@solana/wallet-adapter-react registrerer mobiladapteren automatisk, så en
opgradering af wallet-adapter-pakkerne kan løse Android alene. Målarkitekturen:
Mobile Wallet Adapter på Android, universelle browse-links på iOS, hvor Apple
ikke tillader en tilsvarende løsning.
Efterprøv på en enhed
- Rigtig enhed, wallet installeret, link åbnet fra systembrowseren — ikke fra en messenger.
- Tryk på et renderet link, eller scan en QR-kode; indsæt aldrig i adresselinjen.
- Bekræft, at wallet’en åbner, og at dApp’en indlæses i dens indbyggede browserfane — anden halvdel er den, der fejler.
- Gentag uden wallet’en installeret: det universelle link skal falde tilbage til wallet’ens websted. Ser du dén side, mens appen er installeret, er linket eller udløsningen stadig forkert.
- Test derefter messenger-vejen, og tilføj “åbn i browser”-hjælpen, hvis den fejler dér.
Kilder
Det er præcis den slags problemer, vi løser for vores kunder. Kontakt os.
