Skip to content

Instantly share code, notes, and snippets.

View buraxta's full-sized avatar

Burak Güllüler buraxta

View GitHub Profile

iOS WKWebView Link Açma Sorunu ve Çözüm Adımları

Sorun

ChatAI web widget'ımız içerisindeki sohbet akışında yer alan dış bağlantıların (fatura listesi, harita lokasyonu vb.) Web ve Android ortamlarında sorunsuz açılmasına rağmen, iOS uygulamasındaki WKWebView içerisinde tıklamalara tepki vermemesi (sayfanın açılmaması) sorunu yaşanmıştır.

Neler Denedik ve Neden Olmadı?

Web tarafında (widget içerisinde) HTML ve CSS üzerinden çeşitli standart çözümler denenmiştir:

  1. <a> etiketi ve target="_blank" kullanımı: - Neden Olmadı? iOS WKWebView güvenlik politikaları gereği, native tarafta özel bir izin (UIDelegate) yazılmadığı sürece yeni sekme/pencere açma isteklerini engelledi.
  2. target="_top" ve Native Yönlendirme Denemesi:

MoTeam İnceleme ve İyileştirme Raporu

1. UI ve Görsel Tasarım Tavsiyeleri

  • Arayüzde çok fazla beyaz alan ve açık gri tonu var. Biz yazılımcılar için gün boyu bu kadar parlak bir ekrana bakmak göz yorucu. Acilen bir Karanlık Tema seçeneği eklenmeli.
  • "Taleplerim", "Görevlerim" veya "Projelerim" gibi sekmelerde veri olmadığında ekran çok atıl kalıyor. Bu alanları sadece "Kayıt bulunamadı" yazısıyla bırakmak yerine; hızlı görev ekleme butonları, sistem kullanım ipuçları veya kısa "onboarding" videoları ile doldurmak UX'i güçlendirir.
  • Bazı metin ve ikonlarda (özellikle takvimdeki pasif günler) kontrast çok düşük. Erişilebilirlik standartları açısından bu renk paleti gözden geçirilmeli.

2. UX Tavsiyeleri

Widget'ın mobil cihazlarda otomatik olarak başlaması (Auto-start), tarayıcının kimlik bilgileri üzerinden yapılan bir tespite dayanır.

🛠 Bizim Tarafımızdaki Tespit Mantığı

Chat Widget'ımız, cihazın mobil olup olmadığını anlamak için tarayıcının paylaştığı User-Agent dizesini standart Regex (Düzenli İfade) yöntemleriyle kontrol eder.

Sistemde çalışan güncel kod bloğumuz şudur:

/* src/app/utils/utils.ts */
const badgeDefinitions = [
{
id: 'golden-quality',
name: 'Altın Kalite Rozeti',
description: 'Aylık ortalama kalite puanı ≥93',
icon: IconTrophy,
color: '#FFD700',
bgColor: 'rgba(255, 215, 0, 0.1)',
check: (data, allChannelData, vendorAgentStatistic) => {
return data.totalPointMean >= 93;

Sorunun kaynağı backend response yapısıyla ilgili görünüyor.

  • Mevcut response sadece şu özetleri sağlıyor:
    • categoryMap: Ana kategori -> toplam adet
    • subCategoryMap: Alt kategori -> toplam adet (global)
    • subCategorySentiment: Alt kategori -> sentiment (global)
  • Kategoriye-özel alt kategori dağılımı olmadığı için:
    • Aynı alt kategori adı birden fazla ana kategoride kullanıldığında, global subCategoryMap toplaması bazı kategorilerde üst toplamı aşabiliyor.
    • Bazı kayıtlarda alt kategori boş/harici olduğunda, üst toplam alt toplamlardan büyük kalıyor.

Server log kayıtlarını sorunlu (boş array) ve sorunusuz response alma durumuna göre inceledim, inceleme sonucunu sizlerle paylaşıyorum.

Senaryo 1: "Dolu Aldığım" (Başarılı İstek)

Bu testte, tcpdump çıktısında (saat 13:03:48) şunları görüyoruz:

  1. backend'den livekit'e giden isteğin kendisi:
    13:03:48.096833 IP localhost.42468 > localhost.pss: Flags [P.]...
    POST /twirp/livekit.SIP/ListSIPOutboundTrunk HTTP/1.1
    

Host: livekit.enmdigital.com

public async Task<ServiceResult<List<SIPOutboundTrunkInfo>>> GetOutboundTrunksAsync()
{
if (!await _permissionChecker.HasPermissionAsync(PermissionConstants.Trunk.List))
{
return ServiceResult<List<SIPOutboundTrunkInfo>>.Fail("Trunk listeleme yetkiniz yok.");
}
var tenantKey = _tenantProvider.GetTenantKey();
// --- YENİ EKLENECEK TRY-CATCH ---
@buraxta
buraxta / docker-compose.yml
Created September 19, 2025 19:10
docker-compose.yml
version: "3.7"
volumes:
tiledesk-datadb:
services:
dashboard:
image: buraxtaa/tiledesk-dashboard-custom:latest
container_name: dashboard
restart: always
ports:
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Fenerbahçe Basketbol Altyapı Seçmeleri Sonucu - İkinci Aşama</title>
</head>
<body style="margin: 0; font-family: Arial, Helvetica, sans-serif; background-color: #002b5c; color: white; padding: 20px;">
<table width="100%" cellpadding="0" cellspacing="0" style="max-width: 600px; margin: 0 auto; background-color: #002b5c;">
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Fenerbahçe Basketbol Altyapı Seçmeleri Sonucu</title>
</head>
<body style="margin: 0; font-family: Arial, Helvetica, sans-serif; background-color: #002b5c; color: white; padding: 20px;">
<table width="100%" cellpadding="0" cellspacing="0" style="max-width: 600px; margin: 0 auto; background-color: #002b5c;">