Uygulama bağlantılarını doğrulama

Uygulamanızın intent filtrelerinden en az birinde android:autoVerify="true" varsa uygulamanızı Android 6.0 (API düzeyi 23) veya sonraki sürümleri çalıştıran bir cihaza yüklediğinizde sistem, uygulamanızın intent filtrelerindeki URL'lerle ilişkili ana makineleri otomatik olarak doğrular. Android 12 ve sonraki sürümlerde, doğrulama mantığını test etmek için doğrulama sürecini manuel olarak da çağırabilirsiniz.

Otomatik doğrulama

Sistemin otomatik doğrulaması şunları içerir:

  1. Sistem, aşağıdakilerden herhangi birini içeren tüm intent filtrelerini inceler:
    • İşlem: android.intent.action.VIEW
    • Kategoriler: android.intent.category.BROWSABLE ve android.intent.category.DEFAULT
    • Veri şeması: http veya https
  2. Android, intent filtrelerinde bulunan her benzersiz ana makine adı için ilgili web sitelerinde https://hostname/.well-known/assetlinks.json adresindeki Digital Asset Links dosyasını sorgular.

Uygulamanızla ilişkilendirilecek web sitelerinin listesini ve barındırılan JSON dosyasının geçerli olduğunu onayladıktan sonra uygulamayı cihazınıza yükleyin. Eşzamansız doğrulama işleminin tamamlanması için en az 20 saniye bekleyin. Sistemin uygulamanızı doğrulayıp doğru bağlantı işleme politikalarını ayarladığını kontrol etmek için aşağıdaki komutu kullanın:

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://domain.name:optional_port"

Manuel doğrulama

Android 12'den itibaren, cihaza yüklenen bir uygulama için alan doğrulamasını manuel olarak çağırabilirsiniz. Uygulamanızın Android 12'yi hedefleyip hedeflemediğine bakılmaksızın bu işlemi gerçekleştirebilirsiniz.

İnternet bağlantısı kurma

Alan doğrulaması yapmak için test cihazınızın internete bağlı olması gerekir.

Güncellenen alan doğrulama sürecini destekleme

Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa sistem, güncellenmiş alan doğrulama sürecini otomatik olarak kullanır.

Aksi takdirde, güncellenen doğrulama sürecini manuel olarak etkinleştirebilirsiniz. Bunun için terminal penceresinde aşağıdaki komutu çalıştırın:

adb shell am compat enable 175408749 PACKAGE_NAME

Cihazda Android Uygulama Bağlantıları'nın durumunu sıfırlama

Bir cihazda alan doğrulamasını manuel olarak çağırmadan önce test cihazındaki Android Uygulama Bağlantıları'nın durumunu sıfırlamanız gerekir. Bunun için bir terminal penceresinde aşağıdaki komutu çalıştırın:

adb shell pm set-app-links --package PACKAGE_NAME 0 all

Bu komut, cihazı kullanıcının herhangi bir alan için varsayılan uygulamaları seçmeden önceki durumuna getirir.

Alan doğrulama sürecini başlatma

Bir cihazda Android Uygulama Bağlantıları'nın durumunu sıfırladıktan sonra doğrulama işlemini gerçekleştirebilirsiniz. Bunun için terminal penceresinde aşağıdaki komutu çalıştırın:

adb shell pm verify-app-links --re-verify PACKAGE_NAME

Doğrulama sonuçlarını inceleme

Doğrulama aracısının isteklerini tamamlaması için biraz bekledikten sonra doğrulama sonuçlarını inceleyin. Bunun için aşağıdaki komutu çalıştırın:

adb shell pm get-app-links PACKAGE_NAME

Bu komutun çıkışı aşağıdakine benzer:

com.example.pkg:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [***]
    Domain verification state:
      example.com: verified
      sub.example.com: legacy_failure
      example.net: verified
      example.org: 1026

Doğrulamayı başarıyla geçen alanların alan doğrulama durumu verified olur. Diğer durumlar, alan doğrulamasının gerçekleştirilemediğini gösterir. Özellikle none durumu, doğrulama temsilcisinin doğrulama sürecini henüz tamamlamamış olabileceğini gösterir.

Aşağıdaki listede, alan doğrulamanın belirli bir alan için döndürebileceği olası dönüş değerleri gösterilmektedir:

none
Bu alan için hiçbir şey kaydedilmedi. Doğrulama aracısının alan doğrulamayla ilgili istekleri tamamlaması için birkaç dakika daha bekleyin ve ardından alan doğrulama sürecini tekrar çağırın.
verified
Alan, bildirimde bulunan uygulama için başarıyla doğrulandı.
approved
Alan, genellikle bir kabuk komutu yürütülerek zorunlu olarak onaylandı.
denied
Alan, genellikle bir kabuk komutu yürütülerek zorunlu olarak reddedildi.
migrated
Sistem, eski alan doğrulaması kullanan önceki bir işlemin sonucunu korudu.
restored
Kullanıcı veri geri yükleme işlemi gerçekleştirdikten sonra alan onaylandı. Alan adının daha önce doğrulandığı varsayılır.
legacy_failure
Alan, eski bir doğrulayıcı tarafından reddedildi. Başarısızlığın kesin nedeni bilinmiyor.
system_configured
Alan, cihaz yapılandırması tarafından otomatik olarak onaylandı.
Hata kodu 1024 veya daha büyük

Cihazın doğrulayıcısına özel hata kodu.

Ağ bağlantısı kurduğunuzdan emin olun ve alan doğrulama sürecini tekrar başlatın.

Kullanıcıdan uygulamanızı bir alanla ilişkilendirmesini isteme

Uygulamanızın bir alan için onaylanmasının başka bir yolu da kullanıcıdan uygulamanızı bu alanla ilişkilendirmesini istemektir.

Uygulamanızın alan için onaylanıp onaylanmadığını kontrol etme

Kullanıcıdan onay istemeden önce uygulamanızın, <intent-filter> öğelerinizde tanımladığınız alanlar için varsayılan işleyici olup olmadığını kontrol edin. Onay durumunu aşağıdaki yöntemlerden birini kullanarak sorgulayabilirsiniz:

DomainVerificationManager

Aşağıdaki kod snippet'inde, DomainVerificationManager API'nin nasıl kullanılacağı gösterilmektedir:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class.java)
val userState = manager.getDomainVerificationUserState(context.packageName)

// Domains that have passed Android App Links verification.
val verifiedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }

// Domains that haven't passed Android App Links verification but that the
// user has associated with an app.
val selectedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }

// All other domains.
val unapprovedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }

Java

Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
        context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
        manager.getDomainVerificationUserState(context.getPackageName());

Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
    Integer stateValue = hostToStateMap.get(key);
    if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
        // Domain has passed Android App Links verification.
        verifiedDomains.add(key);
    } else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
        // Domain hasn't passed Android App Links verification, but the user
        // has associated it with an app.
        selectedDomains.add(key);
    } else {
        // All other domains.
        unapprovedDomains.add(key);
    }
}

Komut satırı programı

Geliştirme sırasında uygulamanızı test ederken kuruluşunuzun sahip olduğu alanların doğrulama durumunu sorgulamak için aşağıdaki komutu çalıştırabilirsiniz:

adb shell pm get-app-links --user cur PACKAGE_NAME

Aşağıdaki örnek çıktıda, uygulama "example.org" alan adı için doğrulamayı geçememiş olsa da 0 kullanıcısı, uygulamayı sistem ayarlarında manuel olarak onaylamıştır ve bu alan adı için başka bir paket doğrulanmamıştır.

com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
  example.com: verified
  example.net: verified
  example.org: 1026
User 0:
  Verification link handling allowed: true
  Selection state:
    Enabled:
      example.org
    Disabled:
      example.com
      example.net

Kullanıcının belirli bir alan adıyla ilişkili uygulamayı seçtiği süreci simüle etmek için kabuk komutlarını da kullanabilirsiniz. Bu komutların tam açıklaması adb shell pm çıkışında mevcuttur.

İstekle ilgili bağlam bilgisi verme

Alan onayı için bu isteği göndermeden önce kullanıcıya biraz bilgi verin. Örneğin, kullanıcılara uygulamanızın neden belirli bir alan için varsayılan işleyici olması gerektiğini açıklayan bir başlangıç ekranı, iletişim kutusu veya benzer bir kullanıcı arayüzü öğesi gösterebilirsiniz.

İstek oluşturma

Kullanıcı, uygulamanızın kendisinden ne yapmasını istediğini anladıktan sonra isteği gönderin. Bunu yapmak için aşağıdaki kod snippet'inde gösterildiği gibi, hedef uygulama için ACTION_APP_OPEN_BY_DEFAULT_SETTINGS intent işlemini ve package:com.example.pkg ile eşleşen bir veri dizesini içeren bir intent çağırın:

Kotlin

val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:${context.packageName}"))
context.startActivity(intent)

Java

Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

İntent çağrıldığında kullanıcılar Varsayılan olarak aç adlı bir ayarlar ekranı görür. Bu ekranda, Şekil 1'de gösterildiği gibi Desteklenen bağlantıları aç adlı bir radyo düğmesi bulunur.

Kullanıcı Desteklenen bağlantıları aç'ı etkinleştirdiğinde Bu uygulamada açılacak bağlantılar adlı bölümün altında bir dizi onay kutusu görünür. Kullanıcılar buradan uygulamanızla ilişkilendirmek istedikleri alanları seçebilir. Ayrıca Şekil 2'de gösterildiği gibi Bağlantı ekle'yi seçerek alan ekleyebilirler. Kullanıcılar daha sonra ekledikleri alanlardaki herhangi bir bağlantıyı seçtiğinde bağlantı otomatik olarak uygulamanızda açılır.

Radyo düğmesi etkinleştirildiğinde, alt kısma yakın bir bölümde onay kutuları ve &quot;Bağlantı ekle&quot; adlı bir düğme bulunur.
Şekil 1. Kullanıcıların hangi bağlantıların varsayılan olarak uygulamanızda açılacağını seçebileceği sistem ayarları ekranı.
Her onay kutusu, ekleyebileceğiniz bir alanı temsil eder. İletişim kutusunda &quot;İptal&quot; ve &quot;Ekle&quot; düğmeleri bulunur.
Şekil 2. Kullanıcıların uygulamanızla ilişkilendirmek için ek alanlar seçebileceği iletişim kutusu.

Uygulamanızın doğrulayamadığı alanları uygulamanızda açma

Uygulamanızın temel işlevi, işlediği alanları doğrulama özelliği olmadan bağlantıları üçüncü taraf olarak açmak olabilir. Bu durumda, kullanıcılara bir web bağlantısı seçtiklerinde birinci taraf uygulaması ile sizin (üçüncü taraf) uygulamanız arasında seçim yapamayacaklarını açıklayın. Kullanıcıların alanları üçüncü taraf uygulamanızla manuel olarak ilişkilendirmesi gerekir.

Ayrıca, kullanıcı isterse bağlantıyı birinci taraf uygulamasında açmasına olanak tanıyan bir iletişim kutusu veya trambolin etkinliği sunmayı da düşünebilirsiniz. Bu durumda, birinci taraf uygulaması proxy görevi görür. Böyle bir iletişim kutusu veya trambolin etkinliği oluşturmadan önce uygulamanızı, uygulamanızın web intent filtresiyle eşleşen birinci taraf uygulamalara paket görünürlüğü olacak şekilde ayarlayın.

Digital Asset Links güncelleme gecikmesi

Web sunucunuzdaki assetlinks.json dosyasını güncellediğinizde bu değişikliklerin son kullanıcı cihazlarına yansıtılması için gereken süre, OS sürümüne bağlıdır:

  • Android 15 (API düzeyi 35) ve sonraki sürümler: Sistem, alanları arka planda düzenli olarak yeniden doğrular. Sistemin önbelleğe alma ve planlanmış yeniden doğrulama işlemleri nedeniyle, değişikliklerin tüm son kullanıcı cihazlarına uygulanması yedi günü bulabilir.
  • Android 14 (API düzeyi 34) ve önceki sürümler: Sistem, arka planda düzenli olarak yeniden doğrulama yapmaz. Dosyadaki güncellemeler genellikle yalnızca uygulama yüklendiğinde veya güncellendiğinde alınır.

Test güncellemeleri

Test sırasında belirli bir cihazda yeniden doğrulamayı zorunlu kılmak için uygulamayı kaldırıp yeniden yükleyebilirsiniz. Ancak yeniden yükleme işleminden sonra bile sunucu tarafı önbelleklerinin, güncellenmiş assetlinks.json dosyasının cihaza teslimini geciktirebileceğini unutmayın. Önbellek zamana dayalı olduğundan, birkaç saat sonra tekrar denerseniz gecikme genellikle otomatik olarak çözülür.