Appy

Strumento gratuito

Generatore di AASA e assetlinks.json

Crea il file apple-app-site-association per gli Universal Links di iOS e il file assetlinks.json per gli App Links di Android. Inserisci i dati della tua app, poi copia o scarica un file pronto da caricare.

  • Gratis, senza account
  • Funziona nel tuo browser
  • Formato components attuale di Apple

Hai già i file? Controllali con il validatore

App

Aggiungi ogni app che deve aprire i link di questo dominio. Ognuna diventa una voce di appIDs.

  1. App 1

    10 caratteri, nel tuo account Apple Developer sotto Membership details.

    Dal target della tua app in Xcode, per esempio com.example.app.

Percorsi che aprono l’app

Le regole vengono lette dall’alto in basso e vince la prima che corrisponde, quindi metti le esclusioni sopra le regole più ampie. * corrisponde a qualsiasi numero di caratteri, ? a uno solo.

  1. Regola 1

    coppie nome=valore unite da &

Altri servizi

Il tuo file

apple-app-site-association

Esempio. Inserisci i tuoi dati per sostituirlo.

{
  "applinks": {
    "details": [
      {
        "appIDs": [
          "ABCDE12345.com.example.app"
        ],
        "components": [
          {
            "/": "/*"
          }
        ]
      }
    ]
  }
}

Generato nel tuo browser. Non viene inviato nulla.

Dove pubblicarlo

  1. Caricalo su https://tuo-dominio/.well-known/apple-app-site-association, senza estensione .json.
  2. Servilo in HTTPS con un certificato valido e un 200 diretto, senza redirect.
  3. Invia l’intestazione Content-Type: application/json.
  4. Ripeti su ogni host dei tuoi link: example.com e www.example.com richiedono ciascuno il file e una voce applinks:.
  5. La CDN di Apple recupera il nuovo file entro 24 ore. Nel frattempo prova con ?mode=developer.
Controlla un dominio con il validatore

Preferisci non ospitare file da solo? Gli smart link sono gratis e con Enterprise Appy serve entrambi i file sul dominio di link della tua app.

Crea un link gratis

Come si incastra tutto

Due file, una verifica reciproca

Universal Links e App Links aprono la tua app solo quando le due parti garantiscono l’una per l’altra. L’app nomina il dominio e un file su quel dominio nomina l’app. Se manca una delle due metà, il link apre il tuo sito.

App iOS

Entitlement Associated Domains

applinks:example.com

Il tuo dominio

example.com/.well-known/

  • apple-app-site-association

    Indica l’app ID: Team ID più bundle ID

    ABCDE12345.com.example.app
  • assetlinks.json

    Indica il nome del pacchetto e l’impronta SHA-256

    com.example.app · 14:6D:E9:…

App Android

Intent filter con autoVerify

android:autoVerify="true"android:host="example.com"

Le due metà corrispondono: il link apre l’app

Manca qualcosa: il link apre il tuo sito

iOS scarica il file tramite la CDN di Apple quando l’app viene installata e controlla gli aggiornamenti circa una volta a settimana. Android verifica al momento dell’installazione. Nessuno dei due interroga il tuo dominio nel momento del tocco.

Campo per campo

Cosa significa ogni chiave dei file

Entrambi i file sono semplice JSON. Ecco le chiavi che scrive il generatore, più quelle facoltative che vale la pena conoscere.

apple-app-site-association

applinks
Il servizio Universal Links. Tutto ciò che decide quale URL apre quale app sta qui dentro.
details
Un array di voci, ognuna delle quali abbina un gruppo di app a un gruppo di regole URL. Usane più di una se app diverse gestiscono percorsi diversi.
appIDs
App ID nel formato <Team ID>.<bundle ID>, per esempio ABCDE12345.com.example.app. Ogni app deve indicare il dominio anche nel proprio entitlement Associated Domains.
components
Le regole URL, lette in ordine. La prima che corrisponde decide se l’app si apre.
/
Un pattern per il percorso dell’URL, come /products/*. Se lo ometti, va bene qualsiasi percorso.
?
I parametri di query da far corrispondere, come dizionario. {"ref": "?*"} richiede un parametro ref non vuoto.
#
Un pattern per il frammento dopo #.
exclude
Impostalo su true per lasciare sul sito gli URL che corrispondono. Metti queste regole sopra quelle più ampie.
comment
Una nota per chi legge il file. iOS la ignora.
webcredentials
Facoltativo. Elenca le app che possono usare con il riempimento automatico le password salvate per questo sito.
appclips
Facoltativo. Elenca le App Clip che questo dominio può avviare.

* corrisponde a qualsiasi numero di caratteri, ? a uno solo e ?* ad almeno uno. Il confronto distingue maiuscole e minuscole, a meno che tu non aggiunga "caseSensitive": false.

assetlinks.json

[ ]
Il file è un array JSON di dichiarazioni, anche quando ne contiene una sola.
relation
delegate_permission/common.handle_all_urls permette all’app di aprire i link di questo sito. delegate_permission/common.get_login_creds aggiunge la condivisione delle credenziali.
target
L’app a cui si riferisce la dichiarazione.
namespace
Sempre android_app per un’app Android.
package_name
L’applicationId dell’app, per esempio com.example.app.
sha256_cert_fingerprints
Le impronte SHA-256 dei certificati che firmano l’app, in coppie maiuscole separate da due punti. Elenca ogni chiave che firma build installate dagli utenti.
relation_extensions
Facoltativo, da Android 15 in poi. Il suo dynamic_app_link_components aggiunge regole sui percorsi nello stile dei components di Apple. Le versioni precedenti lo ignorano.

Il vecchio formato paths

Prima di iOS 13 ogni voce aveva un solo appID, un array paths con NOT davanti alle esclusioni, e il file richiedeva un array apps vuoto. iOS 13 e successivi leggono appIDs e components. Il generatore scrive solo il formato moderno. Se supporti ancora iOS 12, aggiungi le vecchie chiavi nella stessa voce.

Vecchio, iOS 12 e precedenti
{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "ABCDE12345.com.example.app",
      "paths": ["NOT /help/website/*", "/buy/*"]
    }]
  }
}
Moderno, iOS 13 e successivi
{
  "applinks": {
    "details": [{
      "appIDs": ["ABCDE12345.com.example.app"],
      "components": [
        {"/": "/help/website/*", "exclude": true},
        {"/": "/buy/*"}
      ]
    }]
  }
}

Errori comuni

Perché un file che sembra corretto fallisce lo stesso

Il JSON può essere valido e i link aprire comunque il sito. Controlla questi sette punti prima di tutto il resto.

  1. 01iOS

    Prefisso del Team ID sbagliato

    Il file si carica, ma iOS non apre mai l’app.

    Soluzione

    Usa il Team ID dell’account che firma la release, quello sotto Membership details. Non l’ID numerico dell’App Store, non un Key ID e nemmeno il team di un’agenzia se l’app viene pubblicata dal tuo account.

    Guida completa agli Universal Links per iOS e Android
  2. 02Android

    Chiave di caricamento al posto della chiave di firma di Play

    Le tue build aprono l’app, le installazioni da Google Play aprono il browser.

    Soluzione

    Google firma le app che distribuisce con la chiave di firma dell’app. Copia il suo SHA-256 da Play Console, in Integrità dell’app, e lascia nell’elenco la chiave di caricamento solo se condividi build firmate con quella.

    App Links Android non verificati: diagnosi in cinque minuti con adb
  3. 03iOS + Android

    Il file si trova dietro un redirect

    L’URL si apre senza problemi nel browser, ma la verifica fallisce.

    Soluzione

    Apple e Android si aspettano un 200 all’URL esatto. Escludi /.well-known/ dai redirect dal dominio senza www al www, dal www al dominio senza www e per lingua.

    Universal Links aprono Safari? Correggi AASA, App Links, redirect e header
  4. 04iOS + Android

    Content type sbagliato, o HTML al posto di JSON

    Il file c’è, ma la piattaforma lo ignora.

    Soluzione

    Servi entrambi i file come application/json. Spesso i server inviano il file AASA, che non ha estensione, come application/octet-stream, e alcuni hosting rispondono con una pagina di login o un controllo anti-bot.

    Universal Links aprono Safari? Correggi AASA, App Links, redirect e header
  5. 05iOS + Android

    Dimenticare l’host www

    I link a example.com aprono l’app, quelli a www.example.com aprono il sito.

    Soluzione

    Ogni host viene verificato a sé. Carica il file su entrambi, inseriscili entrambi in Associated Domains e dichiarali entrambi negli intent filter Android.

    Guida completa agli Universal Links per iOS e Android
  6. 06iOS

    Un’esclusione sotto una regola generica

    Pagine che volevi lasciare sul sito aprono l’app.

    Soluzione

    Vince la prima regola che corrisponde. Sposta le regole exclude sopra /*, come fa l’esempio di Appy nel generatore.

  7. 07iOS

    Un’estensione .json o la cartella sbagliata

    All’indirizzo richiesto da iOS non c’è niente.

    Soluzione

    Il file si chiama apple-app-site-association, senza estensione, e va in /.well-known/. Il pulsante di download qui sopra usa già questo nome.

Niente hosting da gestire

Lascia che sia Appy a servire entrambi i file

Con Enterprise la tua app riceve un dominio di link tutto suo, e Appy ci ospita apple-app-site-association e assetlinks.json, generati da Team ID, bundle ID, pacchetto e impronte che registri. Gli smart link sono gratis e i deep link arrivano con Pro.

  • Piano gratuito
  • Nessuna carta di credito
  • Clic illimitati su ogni piano
  • I link continuano a funzionare anche se disdici

Domande frequenti

Che cos’è un file apple-app-site-association?

Un file JSON sul tuo dominio che dice a iOS quali app possono aprire quali URL come Universal Links. Si trova in https://tuo-dominio/.well-known/apple-app-site-association, non ha estensione ed elenca gli app ID (Team ID più bundle ID) con le regole URL di ciascuno.

Che cos’è assetlinks.json?

L’equivalente Android, basato su Digital Asset Links di Google. Si trova in https://tuo-dominio/.well-known/assetlinks.json e indica il pacchetto e le impronte del certificato di firma dell’app autorizzata ad aprire i tuoi link. Android lo controlla quando l’app viene installata e solo allora tratta i tuoi link come App Links verificati.

Dove carico i file generati?

Nella cartella /.well-known/ alla radice di ogni host che usi nei link. Entrambi i file devono caricarsi in HTTPS con un 200 diretto, senza redirect e con il content type application/json. Sugli hosting statici serve spesso una regola per le intestazioni del file AASA, perché non ha estensione.

Dove trovo il mio Team ID e il bundle ID?

Il Team ID è nel tuo account Apple Developer, sotto Membership details. Il bundle ID è nella scheda General del target della tua app in Xcode. Insieme formano l’app ID, per esempio ABCDE12345.com.example.app.

Come ottengo l’impronta SHA-256 per assetlinks.json?

Se è Google Play a firmare la tua app, apri Play Console, vai in Integrità dell’app e copia lo SHA-256 del certificato della chiave di firma dell’app. Per le chiavi che custodisci tu, esegui keytool -list -v -keystore my-release-key.keystore oppure ./gradlew signingReport. Il generatore accetta il valore con o senza due punti.

Nel file AASA conviene usare paths o components?

Usa components. Apple l’ha introdotto con iOS 13 e supporta parametri di query, frammenti, esclusioni e commenti. Il vecchio array paths serve solo se supporti ancora iOS 12 o precedenti; in quel caso metti entrambi nella stessa voce.

Un solo file può coprire più app?

Sì. Nel file AASA elenca ogni app ID in appIDs, oppure aggiungi voci details separate se le app gestiscono percorsi diversi. In assetlinks.json aggiungi all’array una dichiarazione per pacchetto. Il generatore gestisce più app iOS; per un secondo pacchetto Android, copia la dichiarazione e cambia nome del pacchetto e impronte.

Quanto tempo serve perché le modifiche arrivino sui dispositivi?

Secondo Apple, la sua CDN richiede il tuo file AASA entro 24 ore e i dispositivi controllano gli aggiornamenti circa una volta a settimana dopo l’installazione. Android verifica quando l’app viene installata; su un dispositivo di test, adb shell pm verify-app-links --re-verify com.example.app ripete il controllo.

Devo firmare il file AASA?

No. Firmarlo con il certificato TLS era necessario solo su iOS 8. Da iOS 9 in poi Apple si aspetta un semplice file JSON servito in HTTPS.

Quello che inserisco viene inviato ad Appy?

No. I file vengono generati da codice che gira nel tuo browser e niente di ciò che scrivi viene caricato o salvato. Il validatore funziona diversamente: quando lo avvii, scarica i file dal tuo dominio.