Appy
← Bloga dön
Rehber

Chrome Her Sunucuya Telefonunuzun Android 10 Olduğunu Söylüyor

Android’deki Chrome 2023’ten beri her telefondan aynı user agent’ı gönderiyor: Android 10, model K. Bunun deferred deep link eşleştirmesini nasıl etkilediğini, sorunu neden Critical-CH ile çözmediğimizi ve Appy link alan adlarının gerçek sürümü ve modeli nasıl geri aldığını anlatıyoruz. Sonunda da aynı sorunun iOS 26’daki karşılığı var.

1 Ekim 2026•7 dk okuma

Artık her Android telefon bir “K”

Son Android sürümünü çalıştıran bir Pixel ile dört yıllık bir Galaxy alın. İkisinde de aynı sayfayı Chrome’da açın. Chrome sürümü dışında gönderdikleri User-Agent başlığı tıpatıp aynıdır: Android 10, cihaz modeli K.

Bu bir hata değil. Adı user-agent reduction: Chrome’un, user agent string’inde cihazın fingerprint’ini çıkarmaya yarayan kısımları donduran gizlilik değişikliği. Android’e Chrome 110 ile geldi. Chromium projesinin takvimine göre dağıtım 7 Şubat 2023’te başladı ve 11 Mayıs 2023’te tüm Android istemcilerine ulaştı.

Çoğu web sitesi bunu fark etmedi bile. Uygulama yüklemelerini tıklamalarla eşleştiren her sistem ise fark etti.

Aynı başlık, öncesi ve sonrası

Chrome 110’dan önce

Mozilla/5.0 (Linux; Android 9; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Mobile Safari/537.36

Chrome 110 ve sonrası

Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Mobile Safari/537.36
chromium.org/updates/ua-reduction sayfasındaki örnek çift. Android sürümü 10, model K olarak dondurulmuş; yalnızca Chrome’un ana sürümü değişmeye devam ediyor.

Deferred deep linklerde ne bozuldu?

Deferred deep link, uygulama yüklenirken kaybolmamalıdır. Mağaza bir token taşıyabiliyorsa taşır: Google Play de Huawei AppGallery de yeni uygulamaya bir referrer iletir ve eşleşme bununla kesinleşir. Taşıyamıyorsa, yani yükleme bir mağaza aramasıyla, sideload ile ya da referrer’ı olmayan bir mağazadan başladıysa geriye tahmin kalır: aynı ağdan gelen yakın zamanlı bir tıklama bulur, aynı telefona benzeyip benzemediğine bakarsınız.

“Benziyor mu” sorusu eskiden user agent’a dayanırdı. Android 14’ten gelen bir tıklama, ilk açılışında Android 15 bildiren bir telefon için zayıf bir adaydı; bir Galaxy’den gelen tıklama da bir Pixel için. Bu değişiklikten sonra her Chrome tıklaması Android 10 ve K dedi. Sürüm bilgisi artık adayları daraltmıyordu; kalabalık bir ağda, bir ofiste ya da kampüste, binadaki bütün Android telefonlar birbirinin aynısıydı.

Appy, Android 10; K değerini olduğu gibi okur: ne sürüm vardır ne model. Tıklamada başka bilgi olmadığında aynı ağdan gelen bütün Android tıklamaları birbirinin aynısı görünüyordu; Appy de yeni kullanıcınızın telefonunu diğerlerinden ayırt edemiyordu.

Kitabi çözüm her tıklamayı iki kez saydırıyor

Chrome bu bilgiyi silmedi, User-Agent Client Hints’e taşıdı. Düşük entropili birkaç ipucu her istekle gelir: tarayıcının markası ve ana sürümü, cihazın mobil olup olmadığı ve platform adı. Bizim için önemli olan ikisi, Sec-CH-UA-Platform-Version ve Sec-CH-UA-Model ise yüksek entropilidir. Chrome bunları ancak site bir Accept-CH yanıt başlığıyla istedikten sonra gönderir; bu yüzden bir siteye giden ilk istekte bu ikisi asla bulunmaz.

Sayfanın daha ilk yüklemede ihtiyaç duyduğu veriler için Google’ın Android’deki user-agent reduction hakkındaki Privacy Sandbox rehberi (27 Şubat 2023) Critical-CH’yi gösteriyor. Sunucu, olmadan çalışamayacağı ipuçlarını belirtir; Chrome bunların eksik olduğunu görünce yanıtı atar ve isteği bu kez ipuçlarıyla birlikte yeniden gönderir.

Sorun o “yeniden” kelimesinde. Bir yönlendirme servisi için bu tekrar, aynı linke yapılan ikinci bir navigasyon demek: her Android dokunuşu iki kez sayılır, geride iki tıklama kaydı kalırdı. Her müşterinin panelinde yanlış rakamlar görünmesindense biraz fazladan iş yapmayı tercih ederiz; bu yüzden Appy Critical-CH kullanmıyor.

Appy link alan adları bunun yerine ne yapıyor?

İki mekanizma var: biri tarayıcıdan gelen ilk dokunuş için, diğeri ondan sonraki her dokunuş için.

Telefondaki Chrome

acme.appy.to

  1. 01Linke ilk dokunuş
    GET /spring HTTP/2
    Host: acme.appy.to
    User-Agent: Mozilla/5.0 (Linux; Android 10; K) … Chrome/154.0.0.0 Mobile Safari/537.36
    Sec-CH-UA-Mobile: ?1
    Sec-CH-UA-Platform: "Android"

    Yalnızca düşük entropili ipuçları. User agent Android 10, model K diyor.

  2. 02Geçiş sayfası
    HTTP/2 200
    Accept-CH: Sec-CH-UA-Platform-Version, Sec-CH-UA-Model
    Content-Type: text/html; charset=utf-8

    Uygulamayı ya da mağazayı açan sayfa. Accept-CH ile sonraki her istekte iki ipucunu da ister.

  3. 03Geçişten önce
    const hints = await navigator.userAgentData
      .getHighEntropyValues(["platformVersion", "model"])
    → {platformVersion: "16.0.0", model: "Pixel 9", …}
    navigator.sendBeacon(…)

    Sayfa gerçek değerleri okur, bu tıklamanın kaydına ekler, ardından geçişi yapar.

  4. 04Sonraki her dokunuş
    GET /summer HTTP/2
    Host: acme.appy.to
    Sec-CH-UA-Platform-Version: "16.0.0"
    Sec-CH-UA-Model: "Pixel 9"

    Chrome bu talebi, kullanıcı site verilerini temizleyene kadar bu origin için hatırlar; artık ipuçları başlık olarak gelir. Script yok, tekrar istek yok.

Her dokunuşta tek navigasyon, dolayısıyla istatistiklerde tek tıklama. Başlık değerleri örnektir.

Gerçek sürüm ve model neyi değiştiriyor?

Tıklama gerçek sürümü ve modeli taşıyınca, tıklama ile telefonun hem sürümde hem modelde uyuşması gerekiyor. SDK, uygulama ilk açıldığında telefonun modelini Build.MODEL üzerinden bildiriyor; böylece ikisi karşılaştırılabiliyor. Bir Pixel 9 tıklaması artık bir Galaxy yüklemesiyle eşleşmiyor, Android 15’ten gelen bir tıklama da Android 16’daki bir telefona uymuyor.

Fark en çok kalabalık ağlarda görülüyor. Kırk telefonlu bir ofis ağında diğer modellerden gelen tıklamalar eleniyor ve çoğu zaman geriye yalnızca Pixel’in kendi tıklaması kalıyor.

Bunların hepsi token olmadan gelen yüklemelerle ilgili. Android’de yüklemelerin çoğu hâlâ önce Google Play ve AppGallery’nin referrer’ıyla çözülüyor; Client Hints geri kalanlar için var. Referrer ya da click ID yoksa Appy yüklemeyi doğrulayamaz; sıkı attribution açıksa tıklama ne kadar uyarsa uysun yükleme organik sayılır.

Aynı ofis ağı, öncesi ve sonrası

Kalabalık bir ofis ağındaki bir Pixel 9, sahibinin bir linke dokunmasından dört dakika sonra uygulamayı ilk kez açıyor. Kullanıcı linkin açtığı mağaza sayfasını kapatmış, uygulamayı Play Store’da arayıp yüklemiş; bu yüzden referrer gelmiyor.

Tıklamadaki Android sürümü
Önce: “Android 10; K”10, yani dondurulmuş değer
Sonra: Client Hints16
Tıklamadaki telefon modeli
Önce: “Android 10; K”K, yani bilinmiyor
Sonra: Client HintsPixel 9
İlk açılışta telefonla karşılaştırma
Önce: “Android 10; K”Android 16 ve Pixel 9 ile karşılaştırılacak bir şey yok
Sonra: Client Hintsİkisinde de aynı sürüm ve model
Ofisten gelen diğer Android tıklamaları
Önce: “Android 10; K”Pixel’in tıklamasından ayırt edilemiyor
Sonra: Client HintsYalnızca Android 16’daki diğer Pixel 9’lar hâlâ uyuyor
Sonuç
Önce: “Android 10; K”Başka bir Android kullanıcısının tıklamasıyla eşleşebilir
Sonra: Client HintsPixel’in kendi tıklamasıyla eşleşir
Aynı yükleme, aynı ağ. Tıklama gerçek sürümü ve modeli taşıdığında diğer telefonlardan gelen tıklamalar artık Pixel’in kendi tıklamasıyla yarışmıyor.

iOS da kendi sürüm numarasını dondurdu

Safari aynı yere başka bir yoldan vardı. Apple’ın Safari 26.0 sürüm notlarına göre Safari artık iOS 26 ve iPadOS 26’da user agent’ında dondurulmuş bir işletim sistemi sürümü bildiriyor: iOS 26’dan önce yayımlanan son sürümü. Pratikte iOS 26 kullanan bir iPhone kendini “iPhone OS 18_6” olarak tanıtıyor. String’in ilerisindeki Version/26.0 token’ı ise hâlâ Safari’nin kendi sürümünü izliyor.

Safari, User-Agent Client Hints’i desteklemiyor; yani isteyebileceğiniz bir şey yok. Appy bunu eşleştirme sırasında çözüyor: telefon iOS 26 veya üstündeyse, iOS 18.6 diyen bir tıklama kesin bir sürüm olarak değil, “26 veya üstü” olarak okunuyor. Çünkü Safari artık hangi sürüm olduğunu söylemiyor.

Yüklemeleri kendiniz eşleştiriyorsanız

Bunların hiçbiri Appy’ye özgü değil.

01

“Android 10; K” değerini bilinmiyor sayın

Ayrıştırın ve bir kenara ayırın. Veri gibi görünen donmuş bir değer, boş bir alandan daha çok zarar verir.

02

İpuçlarını tıklamanın geldiği alan adında isteyin

Link alan adınızdan Accept-CH: Sec-CH-UA-Platform-Version, Sec-CH-UA-Model gönderin; başlıkların henüz gelemeyeceği ilk ziyarette de navigator.userAgentData’yı okuyun.

03

Critical-CH eklemeden önce tekrarın sayılarınıza etkisini hesaplayın

Tekrarlanan bir navigasyon ikinci bir istektir. İstekleri sayıyorsanız ya tekilleştirin ya da tekrardan vazgeçin.

04

iOS 18.6’yı “26 veya üstü” olarak eşleyin

Tıklaması 18.6 dedi diye iOS 26’daki bir yüklemeyi reddetmeyin. Onu kesin bir sürüm olarak değil, iOS 26 veya üstü olarak ele alın.

05

Tahmin yerine token’ı tercih edin

Mağaza referrer’ları ve click ID’ler, her türlü user agent’tan daha güvenilirdir. Deterministik hiçbir sinyal gelmediğinde tahmine başvurun ve bunun bir tahmin olduğunu açıkça belirtin.

Bunları da okuyun

Sık sorulan sorular

Chrome neden her telefonda Android 10 diyor?

User-agent reduction yüzünden. Şubat–Mayıs 2023 arasında dağıtılan Chrome 110’dan beri Android’deki Chrome, User-Agent string’inde işletim sistemi sürümünü 10, cihaz modelini K olarak donduruyor. Gerçek değerlere User-Agent Client Hints üzerinden ulaşılabiliyor.

Chrome’da gerçek Android sürümünü nasıl alabilirim?

Sec-CH-UA-Platform-Version ipucunu bir Accept-CH yanıt başlığıyla isteyin ya da sayfada navigator.userAgentData.getHighEntropyValues(["platformVersion"]) çağırın. Başlık yalnızca Chrome sizin Accept-CH başlığınızı gördükten sonra yapılan isteklerde gelir.

Critical-CH ilk isteği düzeltir mi?

İpuçlarını, Chrome’a isteği tekrarlatarak getirir. Sıradan sayfalarda bu işe yarar. Yönlendirme ya da tıklama takibi gibi istekleri sayan her şeyde ise tekrar, tekilleştirmediğiniz sürece ikinci bir ziyaret gibi görünür.

Safari iOS 26’da ne bildiriyor?

Dondurulmuş bir işletim sistemi sürümü. iOS 26 ve iPadOS 26’da Safari, iOS 26’dan önce yayımlanan son sürümü, pratikte 18_6’yı bildiriyor; Version/26 token’ı ise Safari’yi izlemeye devam ediyor. Safari, User-Agent Client Hints’i desteklemiyor.

Android WebView’larda ve uygulama içi tarayıcılarda da user agent kısıtlanıyor mu?

Varsayılan olarak henüz değil. Google, varsayılan WebView user agent’ının Android 17’den itibaren aynı işlemden geçeceğini söyledi; kendi user agent’ını belirleyen uygulamalar ise onu korur.

Diğer yazılar

Rehber
Aug 14, 2026
11 dk okuma

SDK Olmadan Deferred Deep Linking: Kaputun Altında Gerçekte Nasıl Çalışır?

Link bağlamını, uygulamanıza bir attribution SDK’sı gömmeden kurulum sınırından geçirebilirsiniz. Android ve iOS’ta mağaza sınırını gerçekte neyin aştığını, neyin kırıldığını ve her geçici çözümün gizlilik maliyetini anlatıyoruz.

deferred deep linking
install referrer
ios
android
Yazıyı oku
Ürün
Oct 1, 2026
8 dk okuma

Her Yüklemenin Hangi Linkten Geldiğini Bilin: Appy’nin iOS ve Android SDK’sı

Appy artık linklerinizi uygulama mağazasının ötesine kadar takip ediyor. Yeni SDK her link, QR kod ve kampanya için yüklemeleri, uygulama içi event’leri ve geliri gösterir; yeni kullanıcıları doğru ekranda açar.

install attribution
deferred deep linking
install referrer
mobile attribution
Yazıyı oku
Rehber
May 14, 2026
9 dk okuma

Deferred deep linking: nasıl çalışır ve ne zaman kullanılır

Orijinal link niyetini kurulumun öbür tarafına taşıyın; yeni kullanıcılar genel ana ekran yerine doğru uygulama içi ekrana düşsün.

deferred deep linking
install referrer
deep linking
mobile attribution
Yazıyı oku

Başka konular için blogda gezin.

Yüklemeleri “Android 10”a göre değil, kanıta göre eşleştirin

Appy link alan adları artık Client Hints istiyor. Deferred deep linking ve yüklemelerin attribution’ı, Enterprise planında SDK ile geliyor; akıllı linklere ise ücretsiz başlayabilirsiniz.