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.
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.36Chrome 110 ve sonrası
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.0.0 Mobile Safari/537.36Deferred 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
- 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.
- 02Geçiş sayfası
HTTP/2 200 Accept-CH: Sec-CH-UA-Platform-Version, Sec-CH-UA-Model Content-Type: text/html; charset=utf-8Uygulamayı ya da mağazayı açan sayfa. Accept-CH ile sonraki her istekte iki ipucunu da ister.
- 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.
- 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.
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.
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.
“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.
İ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.
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.
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.
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
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.
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.
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.
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.