Universal Link ve App Link Hata Kodları: Ne Anlama Geliyorlar?
SWCERR00101, SWCERR00301, legacy_failure, 1026: her Universal Link ve Android App Link hatasının gerçekte ne anlama geldiği, nerede karşınıza çıktığı ve uygulamanın yeniden açılmasını sağlayan çözüm. Ya da Appy’nin ücretsiz doğrulayıcısı sorunu saniyeler içinde sizin yerinize bulsun.
Önce gerçekten bozuk olduğundan emin olun
“Universal Links çalışmıyor” şikâyetlerinin çoğu, aslında tam da Apple’ın tasarladığı gibi davranan linkler. Apple’ın TN3155 teknik notu, uygulamanın kapalı kalması gereken durumları sıralıyor: Safari’nin adres çubuğuna yazılan ya da yapıştırılan bir URL doğrudan navigasyon sayılır, bu yüzden tarayıcıda kalır. Bulunduğunuz sayfayla aynı alan adına giden bir link de tarayıcıda kalır. Başka uygulamaların içindekiler dahil üçüncü taraf tarayıcılar ise bir linki uygulamanıza devredip devretmeyeceğine kendisi karar verir.
Bu yüzden tek bir dosyaya dokunmadan önce dürüst bir test yapın. Linki iPhone’daki Notlar’a yapıştırın ve üzerine uzun basın. Yapılandırma doğruysa menü, linki tarayıcının yanı sıra uygulamanızda açmayı da önerir. Kullanıcının orada yaptığı seçim o alan adı için varsayılan olur; dün çalışan bir linkin bugün Safari’yi açmasının sessiz nedenlerinden biri de bu.
Notlar’da uygulama seçeneği çıkmıyorsa ilişkilendirmede bir sorun var demektir; ne olduğunu da hata kodu söyler.
Kestirme yol: Appy’nin ücretsiz doğrulayıcısı
Terminali açmadan önce alan adınızı Appy’nin Universal Link doğrulayıcısına yapıştırın. Doğrulayıcı apple-app-site-association dosyanızı kendi sunucunuzdan ve Apple’ın CDN’inden ayrı ayrı çeker; Apple’daki dosyanın sizinkiyle aynı olup olmadığını anında görürsünüz. Android’in assetlinks.json dosyanızdan ne okuduğunu da Google’ın Digital Asset Links API’sine sorar. Ücretsiz, kayıt gerektirmez ve geliştiricilerinize gönderebileceğiniz tek bir sonuç sayfası verir.
Sorun dosyaların kendisindeyse Appy’nin AASA ve assetlinks.json oluşturucusu ikisini de Team ID, bundle ID ve SHA-256 parmak izinizden hazırlar. Rehberin geri kalanı her hatayı tek tek açıklıyor; doğrulayıcı bir hata işaretlediğinde neyi düzelteceğinizi tam olarak bilirsiniz.
Apple’ın CDN’inde ne olduğuna bakın
iOS 14’ten beri telefonlar apple-app-site-association dosyanızı hiçbir zaman sizin sunucunuzdan indirmiyor. Dosyayı Apple’ın CDN’inden alıyorlar, CDN de onu sizden çekiyor. Yani ilk soru “dosyam doğru mu?” değil, “Apple’da ne var?” olmalı.
Apple’ın CDN’inin alan adınız için tuttuğu dosya
curl -sD - "https://app-site-association.cdn-apple.com/a/v1/links.example.com" -o /dev/nullHata veren bir alan adı böyle yanıt verir
HTTP/1.1 404 Not Found
Apple-Failure-Reason: SWCERR00101 Bad HTTP Response: 404 Not Found
Cache-Control: max-age=3600,publicKendi sunucunuz, CDN’in gördüğü hâliyle
curl -v -A "AASA-Bot/1.0" https://links.example.com/.well-known/apple-app-site-associationSWCERR kodları ve çözümleri
Apple bu kodların bir listesini yayımlamıyor. Aşağıdakiler, Apple’ın CDN’inin Apple-Failure-Reason başlığında döndürdüğü mesajlar; her biri Apple Developer Forums başlıklarında ya da CDN’e kendi yaptığımız isteklerde doğrulandı.
SWCERR00101 · Bad HTTP Response: 404 Not Found
CDN dosyanızı istedi ve 200 dışında bir yanıt aldı. Çoğu zaman dosya kök alan adında durur ama entitlement bir alt alan adını gösterir, ya da tam tersi. applinks: içindeki her host’un https://<host>/.well-known/apple-app-site-association adresinde kendi dosyası olmalı. Burada 502 görüyorsanız Apple sorduğunda origin sunucunuz kapalıydı.
SWCERR00201 · Insecure (non-https) redirects forbidden
Dosyanın URL’i bir http:// adresine yönlendiriyor. Dosyayı her alan adında doğrudan HTTPS üzerinden sunun. Apple’ın dokümanları hiç yönlendirme olmamasını söylüyor; testlerimizde CDN https’ten https’e bir yönlendirmeyi takip etti, ama http’ye düşen bir yönlendirme her seferinde başarısız oldu.
SWCERR00202 · Connections to private/reserved IP addresses are not allowed
Host adı özel ya da ayrılmış bir adrese çözümleniyor, bu yüzden Apple bağlanmıyor. Yalnızca bir VPN içinde var olan staging alan adlarında sık görülür. Bunlar için developer mode kullanın (aşağıda anlatıyoruz), production için de herkese açık bir host.
SWCERR00301 · Timeout
Apple’ın dosyayı indiren servisi bekledi ama hiçbir başlık gelmedi. Bilinmeyen istemcilerin önüne doğrulama adımı koyan güvenlik duvarları, coğrafi engelleme ve bot korumaları en yaygın nedenler. Apple, dosyanın her IP’den erişilebilir olması gerektiğini söylüyor ve IP aralıklarını yayımlamıyor; bu yüzden bu yolu herkese açın.
SWCERR00302 · Network error (temporary)
Geçici bir hata, çoğunlukla DNS kaynaklı. DNS’iniz sağlıklıysa genellikle bir sonraki indirmede düzelir; hata durumunda bu bir saat içinde olur.
SWCERR00303 · TLS error
Sertifikanın süresi dolmuş, başka bir host için verilmiş ya da kendinden imzalı; ya da TLS el sıkışması başarısız olmuş. Apple, tam host adını kapsayan ve herkesçe güvenilen bir sertifika istiyor. example.com için alınmış bir sertifika, açıkça belirtmedikçe links.example.com’u kapsamaz.
SWCERR00305 · Network error
CDN bağlandı ama aktarım yarıda kaldı: EOF, connection refused ya da sunucu göndermediği bir sıkıştırmayı bildirdiğinde gzip: invalid header. O yol için WAF ve sıkıştırma ayarlarını kontrol edin.
SWCERR00401 · Bad JSON content
CDN’e JSON olmayan bir şey geldi; genellikle bir HTML doğrulama sayfası ya da giriş sayfası. Ayrıntıdaki “invalid character ‘<’” bunu ele veriyor. Bir Apple mühendisinin forumlardaki çözümü: sunucu, AASA-Bot/* dahil her user agent’a dosyanın kendisini döndürsün.
Yolları swcutil ile kontrol edin
Dosya Apple’a ulaştıktan sonraki soru, linkinizin onunla eşleşip eşleşmediği. Mac’te swcutil, dosyanın yerel bir kopyasını gerçek bir URL’e karşı test eder; Apple mühendislerinin developer mode yerine önerdiği kontrol de bu.
İndirme testi
sudo swcutil dl -d links.example.comEşleşme testi
sudo swcutil verify -d links.example.com -j ./apple-app-site-association -u https://links.example.com/promoEşleşme böyle görünür
{ s = applinks, a = ABCD123.com.example.app, d = links.example.com }:
Pattern "https://links.example.com/promo" matched.Telefonun kendisi ne düşünüyor?
Developer Mode açıkken Ayarlar › Geliştirici › Universal Links altında bir Diagnostics ekranı bulunur: tam bir URL yazdığınızda yüklü bir uygulamanın onu sahiplenip sahiplenmediğini söyler. Resmin tamamı için bir sysdiagnose alın ve swcutil_show.txt dosyasını açın. Uygulama ID’nizi aratın ve üç satırı okuyun.
Site/Fmwk Approval satırında approved yazmalı. Unspecified ya da denied, telefonun o uygulama ve alan adı için onaylanmış bir dosyayı hiç almadığı anlamına gelir: entitlement’ı, herkese açık erişimi ve Team ID önekini kontrol edin. User Approval, kişinin bu alan adı için tarayıcıyı seçip seçmediğini gösterir. Last Checked ve Next Check, Apple’ın dosyanızı en son ne zaman indirdiğini gösterir.
“Düzelttim ama hiçbir şey değişmedi” anlarının çoğunu bu son nokta açıklıyor. Uygulama yüklendikten sonra telefon dosyayı kabaca haftada bir kontrol eder. Bir düzeltmeyi hemen test etmek için uygulamayı yeniden yükleyin. Staging için applinks girdisine ?mode=developer ekleyin: CDN’i atlar, ama yalnızca geliştirme imzalı build’lerde ve bu modu açtığınız cihazlarda.
Akılda tutmaya değer rakamlar
- Apple’ın CDN’inin testlerimizde sağlam bir dosyayı tuttuğu süre
- 6 sa
- bir hatayı tuttuğu süre
- 1 sa
- bir iPhone’un yüklemeden sonra dosyayı yeniden kontrol etme sıklığı
- ~1 hafta
- Android’de doğrulamaya bakmadan önce beklemeniz gereken en kısa süre
- 20 sn
Apple’ın CDN’inin testlerimizde sağlam bir dosyayı tuttuğu süre
bir hatayı tuttuğu süre
bir iPhone’un yüklemeden sonra dosyayı yeniden kontrol etme sıklığı
Android’de doğrulamaya bakmadan önce beklemeniz gereken en kısa süre
Android App Links: pm get-app-links’in bildirdiği durumlar
Android’de arada bir CDN yok. Cihazdaki doğrulayıcı https://<host>/.well-known/assetlinks.json dosyasını kendisi indirir ve Android 12’den beri doğrulanmamış bir link artık seçim ekranı göstermez: doğrudan tarayıcıda açılır. Eksik bir parmak izinin tıpkı “link çalışıyor, sadece uygulamamda değil” gibi görünmesinin nedeni bu.
Android 12, birden fazla host’un nasıl değerlendirildiğini de değiştirdi. Artık her host ayrı ayrı doğrulanıyor; Android 11 ve öncesinde doğrulamayı geçemeyen tek bir host hepsini düşürür. Android 15’te ise assetlinks.json’daki bir değişikliğin tüm cihazlara ulaşması yedi güne kadar sürebilir.
Doğrulamayı bilgisayarınızdan yeniden çalıştırın
Sıfırla, doğrula, oku
adb shell pm set-app-links --package com.example.app 0 all
adb shell pm verify-app-links --re-verify com.example.app
adb shell pm get-app-links com.example.appTipik çıktı
example.com: verified
sub.example.com: legacy_failure
example.org: 1026Her durum ne anlama geliyor?
verified
Alan adı doğrulamayı geçti. Linkler hâlâ tarayıcıyı açıyorsa intent filter’a bakın: android:autoVerify="true", BROWSABLE kategorisi ve hem http hem https şemaları.
none
Henüz bir kayıt yok. Birkaç dakika bekleyip verify-app-links’i yeniden çalıştırın.
legacy_failure
Eski doğrulayıcı alan adını reddetti ama nedenini söylemedi. İşe dosyanın kendisinden başlayın: HTTP 200, application/json, HTTPS, yönlendirme yok.
1024 ve üzeri (örneğin 1026)
Doğrulayıcıya özgü bir hata. Android’in dokümanları ağı ve barındırmayı işaret ediyor: yine aynı kurallar, yani 200, JSON, HTTPS ve yönlendirme yok.
approved / denied
Doğrulamayla değil, bir shell komutuyla zorla ayarlanmış. Herhangi bir sonuca güvenmeden önce set-app-links ile sıfırlayın.
migrated / restored / system_configured
Eski doğrulamadan aktarılmış, kullanıcı verileriyle geri yüklenmiş ya da cihaz yapılandırmasıyla ayarlanmış. Hata değiller, ama dosyanızın bugün çalıştığının kanıtı da değiller.
Bilgisayarınızda doğru, Play Store’da yanlış olan parmak izi
En yaygın Android hatasının barındırmayla hiçbir ilgisi yok. Play App Signing kullanıyorsanız Google uygulamanızı kendi uygulama imzalama anahtarıyla yeniden imzalar. Upload anahtarınızdan keytool ile aldığınız SHA-256, kullanıcıların telefonlarındaki değil; bu yüzden yerel build’iniz geçerken release build başarısız olur.
Parmak izini bunun yerine Play Console › Release › Setup › App signing ekranından kopyalayın. sha256_cert_fingerprints dizisi birden fazla değer alabilir; debug anahtarınızı da büyük harflerle orada tutun. Ve unutmayın: example.com’dan www.example.com’a ya da http’den https’e bir yönlendirme, Android’in linklerinizin hiçbirini doğrulamayacağı anlamına gelir.
Google’ın dosyanızdan ne okuduğunu görün
Digital Asset Links API
curl "https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls"Siz düzeltirken kampanyalarınız çalışmaya devam etsin
Bozuk ilişkilendirme dosyaları size yükleme kaybettirmemeli. Bir Appy linki her planda her telefonu doğru mağazaya gönderir, Huawei AppGallery dahil. Pro’da ise önce uygulamanızı dener; uygulaması zaten yüklü olan kişi doğrudan uygulamanıza gelir. AASA dosyası, SDK ya da yeni bir sürüm gerekmez. Universal Links yeniden çalıştığında aynı Appy linkini kullanmaya devam edin: basılı kodlar ve gönderiler değişmez.
appy.to/yourapp
siz hata ayıklarken de çalışır
- iPhonePro’da uygulamanız, değilse App Store
- AndroidPro’da uygulamanız, değilse Google Play
- HuaweiAppGallery
- BilgisayarWeb siteniz
Bunları da okuyun
- Universal Link doğrulayıcıAASA dosyanızı hem sunucunuzda hem Apple’ın CDN’inde, assetlinks.json’u da aynı anda kontrol eder.
- AASA ve assetlinks.json oluşturucuTeam ID, bundle ID ve SHA-256 değerlerinizden iki dosyayı da hazırlar.
- Universal Links uygulama yerine Safari’yi açıyorAynı alan adı kuralından kullanıcı tercihine, davranıştan kaynaklanan nedenler.
- Android App Links doğrulanmıyorAndroid tarafının daha ayrıntılı bir incelemesi.
Hata kodlarıyla ilgili sorular
SWCERR kodlarını nerede görürüm?
https://app-site-association.cdn-apple.com/a/v1/alan-adiniz adresine istek attığınızda Apple-Failure-Reason başlığında, Mac’te swcutil dl çıktısında ve cihazda swcd günlüğünde.
Bunların hepsini tek seferde kontrol eden bir araç var mı?
Evet. Appy’nin Universal Link doğrulayıcısı ücretsiz ve kayıt gerektirmiyor. AASA dosyanızı sunucunuzda ve Apple’ın CDN’inde, assetlinks.json dosyanızı da Google’ın Digital Asset Links API’si üzerinden kontrol eder, ardından neyi düzeltmeniz gerektiğini söyler.
Apple’ın düzelttiğim AASA dosyasını almasını nasıl sağlarım?
Apple’ın CDN’ini temizleyemezsiniz. Önbelleğin süresi dolunca dosyayı yeniden çeker; testlerimizde hatalar için bu süre bir saatti. Ardından test telefonunuzda uygulamayı yeniden yükleyin; böylece haftalık kontrolü beklemek yerine yeni kopyayı indirir.
apple-app-site-association dosyasının boyut sınırı var mı?
Apple 2016’da 128 KB’lık bir sınır belgelemişti. Güncel dokümanlar bunu tekrarlamıyor, ama dosyayı küçük tutarsanız bu soru hiç gündeme gelmez.
Linki Safari’ye yazdığımda neden tarayıcıda açılıyor?
Bu beklenen bir davranış. Yazılan URL’ler ve aynı alan adı içindeki linkler tasarım gereği tarayıcıda kalır. Bunun yerine Notlar’dan ya da Mesajlar’dan test edin.
Android’de legacy_failure ne anlama geliyor?
Eski doğrulayıcı alan adını reddetti ve Android nedenini söylemiyor. assetlinks.json’un HTTPS üzerinden, yönlendirme olmadan, application/json olarak 200 döndürdüğünü ve Play App Signing parmak izini içerdiğini kontrol edin.
Bunların hepsinden kaçınabilir miyim?
Kısmen. Pro planda bir Appy linki önce uygulamanızın URL şemasını dener, olmazsa doğru mağazaya yönlendirir; bu yüzden kendi alan adınızda AASA dosyası olmadan da çalışır. Gerçek Universal Links için yine de yukarıdaki yapılandırma gerekir.
Diğer yazılar
Android App Links Doğrulanmıyor: adb ile Beş Dakikalık Teşhis
Android 12’den beri, alan adı doğrulaması başarısız olan bir App Link uygulamanız yerine tarayıcıda açılıyor — sessizce ve her cihazda aynı şekilde değil. Nedeni hızla bulan adb kontrol listesi.
Universal Links Safari açıyor mu? AASA, App Links, redirect ve header sorunlarını düzeltin
Uygulama yerine tarayıcı açan universal links ve app links için uygulanabilir sorun giderme akışı.
Uygulama İçi Tarayıcılar Deep Linkleri Nasıl Ele Alıyor: Instagram, TikTok, Facebook, Gmail, Telegram ve Diğerleri
Linkiniz Safari’den uygulamayı açıp Instagram’da neden ölü kalıyor? Her uygulamanın kullandığı tarayıcı türü, iOS ve Android kuralları ve Instagram’dan Telegram’a uygulama uygulama belgelenmiş davranışlar.
Başka konular için blogda gezin.
Bozuk linkler yüzünden dokunuş kaybetmeyin
Bozuk dosyayı ücretsiz doğrulayıcıyla bulun, bu arada tüm kampanyalarınızı bir Appy linkiyle çalışır tutun: her planda doğru mağaza, Pro’da uygulamanız.