Ana içeriğe geç
Version: 1.6.14

Teydex iOS Document

Bu doküman, Teydex kütüphanesinin iOS platformda güvenli ve sorunsuz bir şekilde entegre edilmesi için gerekli tüm adımları, kullanım örneklerini ve platforma özgü teknik detayları içerir.

Sürüm Gereksinimleri

Teydex iOS kütüphanesini sorunsuz bir şekilde kullanabilmek için sürümlerinizi kontrol etmeniz gerekir.

PlatformMin version
iOSiOS 15.0
Swift 5.5
Xcode 26.1

Swift Package Manager ile Kurulum

KYCFramework paketini projenize eklemek için Xcode'da File > Add Package Dependencies yolunu izleyin ve aşağıdaki paket URL'sini girin. Kütüphane gerekli tüm bağımlılıkları otomatik olarak indirecektir.

https://github.com/innovance-technologies/KYCFramework.git

not

KYCFramework, video görüşme bileşenlerinin dahil edilip edilmemesine göre farklı paket varyantları hâlinde dağıtılmaktadır. Entegrasyonunuzda kullanılacak varyant ve sürüm etiketi Innovance entegrasyon ekibi tarafından tarafınıza iletilir.

Paketi ekledikten veya sürüm yükselttikten sonra Xcode'da File > Packages > Reset Package Caches adımını uygulayın. Projenizin Package.resolved dosyası bağımlılıkların eski sürümlerini tutmaya devam edebildiği için yalnızca "Update to Latest" seçeneği yeterli olmayabilir.

Proje Yapılandırması

Background Modes Ayarları

Signing & Capabilities sekmesinde, Background Modes altında aşağıdaki seçeneklerin işaretli olduğundan emin olun:

  • Audio, AirPlay, and Picture in Picture
  • Voice over IP
  • Background fetch

Info.plist İzinleri

Uygulamanızın Info.plist dosyasına aşağıdaki açıklamaları eklemeniz gerekmektedir. Bu mesajlar, izin istenirken kullanıcılara gösterilecektir:

<key>NSCameraUsageDescription</key>
<string>Video görüşmeleri sırasında diğerlerinin sizi görebilmesi için erişim verin</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Konumunuzun doğrulanabilmesi için erişim verin</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Konumunuzun doğrulanabilmesi için erişim verin</string>
<key>NSMicrophoneUsageDescription</key>
<string>Video görüşmeleri sırasında diğerlerinin sizi duyabilmesi için erişim verin</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Fotoğraflarınızı fotoğraf galerinize kaydedebilmek için erişim verin</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Fotoğraf galerinize göz atabilmek için erişim verin</string>
<key>NSLocationTemporaryUsageDescriptionDictionary</key>
<dict>
<key>FullAccuracy</key>
<string>Konumunuzun doğrulanabilmesi için erişim verin</string>
</dict>
<key>NSSpeechRecognitionUsageDescription</key>
<string>Konuşmaları tanıyabilmek için erişim verin</string>

Info Ekranı

KYC uygulamanızdaki Info ekranı, adımlardan önce görüntülenen bilgi sayfalarını ifade eder. İsteğe bağlı olarak, her adım için aşağıdaki parametreler eklenebilir.

Info Ekranı Özellikleri

ParametreTipAçıklama
setTitleTextStringInfo ekranında görüntülenecek başlık bilgisini belirtir.
setDescriptionTextStringInfo ekranında görüntülenecek açıklama metnini belirtir.
setButtonTextStringInfo ekranında gösterilecek adımı başlatacak butonun metnini belirtir.
setAssetImageNameStringInfo ekranında gösterilecek görseli belirtir.
setLottieFileNameStringInfo ekranında gösterilecek lottie animasyonunu belirtir.
setBullets[String]Info ekranında sonraki adım hakkında madde madde bilgi vermek istediğinizde kullanılabilir.
setCancelButtonIsActiveBoolInfo ekranının sağ üst köşesindeki iptal butonunun gösterilmesini etkinleştirir veya devre dışı bırakır. Varsayılan olarak devre dışıdır.
not

Madde işaretlerinin simgesi adım bazında değil, SDK genelinde UIConfig.bulletIconName ile ayarlanır.

Info Ekranı Kullanımı

let frontInfo = InfoPresentationModelBuilder()
.setTitleText("Kimlik Ön Yüz")
.setDescriptionText("Lütfen aşağıdaki adımları dikkatlice takip ediniz:")
.setButtonText("Devam")
.setLottieFileName("front")
.setBullets([
"Kimliğinizi Yerleştirin\n" +
"Kimliğinizin arka yüzünü, telefon ekranına paralel bir şekilde tutun. Kimlik, ekranda görünen şablonun içine tam olarak yerleşecek şekilde konumlandırılmalıdır.",
"Kimlik Bilgilerinin Görünürlüğü\n Kimlik üzerindeki tüm bilgilerin net bir şekilde göründüğünden emin olun. Kimlik bilgileri bulanık olmamalı ve kolayca okunabilir olmalıdır"
])
.build()

Glare Detection (Işık Yansıması Algılama)

v1.3.1 ile birlikte Front, Back, Liveness ve Passport adımlarında, kullanıcının belgeyi uygun ışık koşullarında göstermesi için ışık yansıması (glare) algılama özelliği eklenmiştir. Ortam çok aydınlıksa, çok karanlıksa veya belge üzerinde yansıma varsa ilgili ekranda kullanıcıya uyarı metni gösterilir.

Aşağıdaki parametreler Front, Back ve Passport adımlarında ortak olarak kullanılabilir:

ParametreTipAçıklama
isGlareDetectionEnableBoolİlgili adımda glare algılamayı etkinleştirir. Front ve Back için varsayılan true, Passport için false.
glareDetectedTextStringBelge üzerinde ışık yansıması algılandığında gösterilecek metin.
tooBrightTextStringOrtam çok aydınlık olduğunda gösterilecek uyarı metni.
tooDarkTextStringOrtam çok karanlık olduğunda gösterilecek uyarı metni.
multipleDocumentsDetectedTextStringKamerada birden fazla belge algılandığında gösterilecek uyarı metni.

Liveness adımında ise yalnızca ortam ışığına bağlı parametreler bulunur:

ParametreTipAçıklama
isGlareDetectionEnableBoolLiveness adımında ortam ışığı izlemeyi etkinleştirir. Varsayılan false; izlemenin çalışması için açıkça true verilmelidir.
tooBrightTextStringOrtam çok aydınlık olduğunda gösterilecek uyarı metni.
tooDarkTextStringOrtam çok karanlık olduğunda gösterilecek uyarı metni.
not

Bu parametrelerden herhangi biri verilmediğinde, SDK varsayılan Türkçe uyarı metinlerini kullanır.

Adımlar (Steps)

Tüm adımlarda kullanılacak özellikler bu alanda belirtilir. Bu özellikler her adımda mevcuttur (Front, Back, Hologram, NFC, Liveness, VideoCall, VideoRecord, Passport, Selfie, KPS).

Step Özellikleri

ParametreTipAçıklama
setInfoViewInfoPresentationModel?İlgili adıma Bilgi ekranı eklemek için kullanılır. İsteğe bağlıdır.
setTitleString?İlgili adımda görüntülenecek Toolbar metnini temsil eder.
setStepTypeTeydexConstants.KYCStep?Adımın tipini belirtir (.idcardFront, .idcardBack, vb.)
setStepInformationTextToSpeechString?Adım başlangıcında seslendirilecek metni temsil eder.
setIdentifyTimeoutTimeInterval?İlgili adım için timeout süresini belirler. Varsayılan değer 30 saniyedir.
setIsGlareDetectionEnableBool?Işık yansıması algılamayı etkinleştirir.
setGlareDetectedTextString?Işık yansıması algılandığında gösterilecek uyarı.
setTooBrightTextString?Ortam çok aydınlık olduğunda gösterilecek uyarı.
setTooDarkTextString?Ortam çok karanlık olduğunda gösterilecek uyarı.
setMultipleDocumentsDetectedTextString?Birden fazla belge algılandığında gösterilecek uyarı.
setCancelButtonIsActiveBoolİlgili adımın yakalama ekranında sağ üstteki kapatma butonunun gösterilip gösterilmeyeceğini belirler. Varsayılan false.
setApproveButtonTextString?Yakalama sonrası onay butonunun metni. Verildiğinde UIConfig.textConfig üzerindeki genel değeri ezer.
setRetakeButtonTextString?Yakalama sonrası yeniden çekme butonunun metni. Verildiğinde UIConfig.textConfig üzerindeki genel değeri ezer.
setNFCTextConfigNFCTextConfig?Yalnızca .nfc adımında geçerlidir; NFC okuma ekranındaki metinleri özelleştirir.
not

setApproveButtonText ve setRetakeButtonText adım bazlıdır ve UIConfig.textConfig ile verilen genel metinleri ezer. setStartButtonText / setStopButtonText yalnızca .videoRecord adımında etkilidir.

Liveness Step Özellikleri

ParametreTipAçıklama
setDirectionTextToSpeechString, String, String, String, Stringcenter, right, left, up, down yönleri için text-to-speech mesajını belirler

VideoRecord Step Özellikleri

ParametreTipAçıklama
setStartButtonTextString?Kaydı başlatma butonunun metni.
setStopButtonTextString?Kaydı durdurma butonunun metni.
setApproveButtonTextString?Kayıt sonrası onaylama butonunun metni.
setRetakeButtonTextString?Kayıt sonrası yeniden kaydetme butonunun metni.
setVideoRecordDurationInt?Maksimum video kayıt süresi (saniye). nil bırakılırsa SDK'nın varsayılan değeri olan 30 saniye kullanılır.

Kimlik Ön Yüz (Front) Adımı

let idFrontStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Ön Yüz")
.setInfoView(frontInfo)
.setStepType(.idcardFront)
.setStepInformationTextToSpeech("Kimliğinizin ön yüzünü telefon ekranına paralel tutun. Kimlik şablonun içine tam olarak yerleştirilmelidir.")
.setIsGlareDetectionEnable(true)
.setGlareDetectedText("Işık yansıması var. Lütfen belgeyi farklı bir açıyla tutun.")
.setTooBrightText("Ortam çok aydınlık. Lütfen ışığı azaltın.")
.setTooDarkText("Ortam çok karanlık. Lütfen aydınlık bir ortama geçin.")
.setMultipleDocumentsDetectedText("Sadece tek belge gösterin.")
.build()

Kimlik Arka Yüz (Back) Adımı

let idBackStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Arka Yüz")
.setInfoView(backInfo)
.setStepType(.idcardBack)
.setStepInformationTextToSpeech("Kimliğinizin arka yüzünü telefon ekranına paralel tutun. Tüm bilgilerin net görünmesini sağlayın.")
.setIsGlareDetectionEnable(true)
.setGlareDetectedText("Işık yansıması var. Lütfen belgeyi farklı bir açıyla tutun.")
.setTooBrightText("Ortam çok aydınlık. Lütfen ışığı azaltın.")
.setTooDarkText("Ortam çok karanlık. Lütfen aydınlık bir ortama geçin.")
.setMultipleDocumentsDetectedText("Sadece tek belge gösterin.")
.build()

NFC Adımı

NFC okuma ekranındaki metinler NFCTextConfig ile adım bazında özelleştirilebilir. Verilmeyen alanlar için SDK kendi lokalize metinlerini kullanır.

ParametreTipAçıklama
successfulReadTextString?NFC okuması başarıyla tamamlandığında gösterilen metin.
scanDescriptionString?Kullanıcıdan kimliğini telefonun arkasına yaklaştırması istenirken gösterilen yönerge.
retryDescriptionString?NFC okuması başarısız olduğunda gösterilen açıklama.
let nfcStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("NFC")
.setInfoView(nfcInfo)
.setStepType(.nfc)
.setStepInformationTextToSpeech("Kimliğinizi telefonunuzun arkasına yaklaştırın. NFC özelliğinin açık olduğundan emin olun.")
.setNFCTextConfig(NFCTextConfig(
successfulReadText: "Kimlik bilgileriniz başarıyla okundu.",
scanDescription: "Kimliğinizi telefonunuzun arka yüzüne temas ettirin ve sabit tutun.",
retryDescription: "Kimlik okunamadı. Lütfen kimliğinizi telefonun arkasına tekrar yaklaştırın."
))
.build()

Hologram Adımı

let hologramStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Hologram")
.setInfoView(hologramInfo)
.setStepType(.hologram)
.setStepInformationTextToSpeech("Kimliğinizin hologram etiketini tarayın. Hologram parlak bir şekilde görünmelidir.")
.build()

Canlılık Kontrolü (Liveness) Adımı

Liveness adımı için LivenessStepBuilder kullanılır. Bu builder, yön bazlı TTS mesajlarını ayarlamak için setDirectionTextToSpeech metodunu sağlar.

let faceStep = LivenessStepBuilder()
.setDirectionTextToSpeech(
center: "Yüzünüzü çerçevenin ortasına tutarak düz bakın.",
right: "Yüzünüzü sağa çevirin.",
left: "Yüzünüzü sola çevirin.",
up: "Yüzünüzü yukarı çevirin.",
down: "Yüzünüzü aşağı çevirin."
)
.setIdentifyTimeout(35)
.setTitle("Canlılık Kontrolü")
.setInfoView(faceInfo)
.setStepInformationTextToSpeech("Kameraya bakın ve yüzünüzü çerçeveye yerleştirin. Başınızı yönlendirmelere göre hareket ettirin.")
.setIsGlareDetectionEnable(true)
.setTooBrightText("Ortam çok aydınlık. Lütfen ışığı azaltın.")
.setTooDarkText("Ortam çok karanlık. Lütfen aydınlık bir ortama geçin.")
.build()

Not: Liveness adımında setGlareDetectedText ve setMultipleDocumentsDetectedText desteklenmez; yalnızca tooBrightText ve tooDarkText geçerlidir.

VideoCall Adımı

let videoCall = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Video Görüşme")
.setInfoView(videoCallInfo)
.setStepType(.videoCall)
.setStepInformationTextToSpeech("Video görüşme başlatılıyor. Yeterli ışık olduğundan emin olun.")
.build()

Görüntülü Beyan (VideoRecord) Adımı

Kullanıcının ekranda gösterilen metni yüksek sesle okuyarak video kaydı oluşturduğu sesli video doğrulama adımıdır.

not

VideoRecord adımında kullanıcının yüksek sesle okuyacağı metin backend tarafından sağlanır. Metin, transaction init isteğinde options objesi içinde video_record_prompt_text ve video_record_prompt_mandatory_texts alanlarıyla backend'e gönderilir; backend bu metni adım sırasında SDK'ya geri döner.

let videoRecordStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Sesli Video Doğrulama")
.setInfoView(videoRecordInfo)
.setStepType(.videoRecord)
.setStepInformationTextToSpeech("Ekranda gösterilen metni yüksek sesle okuyarak video kaydı oluşturun.")
.setStartButtonText("Kayda Başla")
.setStopButtonText("Kaydı Durdur")
.setApproveButtonText("Onayla")
.setRetakeButtonText("Yeniden Kaydet")
.setVideoRecordDuration(30)
.build()

Not: iOS SDK'daki VideoRecord adımı, Android karşılığına kıyasla daha sınırlı bir yapılandırma yüzeyine sahiptir. videoQuality, faceCenterTimeoutMs, readyCountdownMs gibi zamanlama/kalite parametreleri ile yüz konumlandırma ve yön uyarı metinleri (centerYourFaceText, tooCloseText, moveLeftText vb.) ve okuma yönergesi metni (readingInstructionText) şu an için iOS'ta yapılandırılabilir değildir; bu metinler SDK içinde sabit olarak tanımlıdır.

Diğer Adım Tipleri

Yukarıdaki adımların yanında, akışa backend tarafından dahil edilebilen adım tipleri de setStepType ile yapılandırılabilir:

Adım tipiAçıklama
.passportPasaport otomatik algılama adımı. Türk ve Rus pasaportları desteklenir; şablon, backend'den gelen belge tipine göre seçilir. Glare algılama bu adımda varsayılan olarak kapalıdır.
.selfieÖn kameradan selfie fotoğrafı çekilen adım. setApproveButtonText ve setRetakeButtonText bu adımda geçerlidir.
.ruAddressValidationRus pasaportu adres sayfası fotoğrafının çekildiği doğrulama adımı.
.kpsKimlik Paylaşım Sistemi doğrulaması. Kullanıcı arayüzü yoktur; SDK doğrudan backend sorgusunu yapar ve sonucuna göre bir sonraki adıma geçer.
not

Bu adımlar akışa yalnızca backend'in döndürdüğü adım listesine göre dahil edilir. stepList içinde tanımlanan Step nesneleri, ilgili adım akışa girdiğinde kullanılacak başlık, info ekranı ve metin ayarlarını sağlar.

LivenessConfig

Canlılık adımındaki UI metinlerini ve görsel stilini özelleştirmek için kullanılır.

LivenessConfig Özellikleri

ParametreTipAçıklama
dotRadiusCGFloat?Canlılık kontrolü sırasında ekranda görüntülenen noktaların yarıçapını belirtir.
dotColorUIColor?Canlılık göstergeleri için kullanılan noktaların varsayılan rengini tanımlar.
activeDotColorUIColor?Canlılık kontrolü sırasında aktif olan noktanın rengini ayarlar.
titleTextString?Canlılık kontrolü sırasında görüntülenen ana başlık metni.
upTextString?Kullanıcının başını yukarı hareket ettirmesi gerektiğinde görüntülenen talimat metni.
downTextString?Kullanıcının başını aşağı hareket ettirmesi gerektiğinde görüntülenen talimat metni.
leftTextString?Kullanıcının başını sola çevirmesi gerektiğinde görüntülenen talimat metni.
rightTextString?Kullanıcının başını sağa çevirmesi gerektiğinde görüntülenen talimat metni.
centerYourFaceTextString?Kullanıcının yüzünü çerçeveye ortalamsını isteyen talimat metni.
faceNotDetectedTextString?Canlılık kontrolü sırasında kullanıcının yüzü algılanmadığında görüntülenen mesaj.
overlayTextString?Yüz algılama çemberi görünmeden önce overlay üzerinde gösterilen metin.

LivenessConfig Kullanımı

let livenessConfig = LivenessConfig(
dotRadius: 10.0,
dotColor: .gray,
activeDotColor: .green,
titleText: "Yüz Doğrulama",
upText: "Lütfen başınızı yukarı kaldırın",
downText: "Lütfen başınızı aşağı indirin",
leftText: "Lütfen başınızı sola çevirin",
rightText: "Lütfen başınızı sağa çevirin",
centerYourFaceText: "Lütfen yüzünüzü ortalayın",
faceNotDetectedText: "Yüz algılanamadı"
)

UIConfig

Info ekranları ve bottom sheet'lerde kullanılan görsel stilleri yapılandırmak için kullanılır.

UIConfig, renk, tipografi, şekil ve madde işareti ikon ayarlarını tek bir yapı altında toplar.

UIConfig Özellikleri

ParametreTipAçıklama
colorsColorsConfig?Info ekranları ve bottom sheet'lerde kullanılacak renk ayarlarını yapılandırmak için kullanılır.
typographyTypographyConfig?SDK genelinde kullanılacak font ailesi, font boyutları ve font kalınlıklarını yapılandırmak için kullanılır.
shapesShapesConfig?Info ekranları ve bottom sheet'lerde kullanılacak şekil ayarlarını yapılandırmak için kullanılır.
bulletIconNameString?Info ekranları ve bottom sheet'lerde madde işaretleri için kullanılan simgenin adını belirtir.
textConfigTextConfig?Fotoğraf onay ekranındaki buton metinlerini özelleştirmek için kullanılır.

ColorsConfig Özellikleri

ParametreTipAçıklama
buttonColorUIColor?Butonların arka plan rengini belirtir.
buttonTextColorUIColor?Butonların metin rengini ayarlar.
bulletTextColorUIColor?Madde işaretli metinlerin rengini tanımlar.
titleColorUIColor?Info ekranlarındaki başlık metninin rengini tanımlar.
descriptionColorUIColor?Info ekranlarındaki açıklama metninin rengini tanımlar.
primaryColorUIColor?Birincil marka rengi: çerçeveli (line) butonların kenarlığı ve kamera overlay vurguları. Geriye dönük uyumluluk için buttonColor'dan bağımsızdır; tek bir marka rengi için ikisini de aynı değere set edin.
onPrimaryColorUIColor?primaryColor yüzeyleri üzerinde çizilen içeriğin rengi (ör. yükleniyor göstergesi).
surfaceColorUIColor?Yüzey bileşenlerinin arka plan rengi: bottom sheet gövdesi ve toast mesajları.
onSurfaceColorUIColor?surfaceColor bileşenleri üzerindeki metinlerin rengi.
backgroundColorUIColor?SDK ekranlarının tam ekran arka plan rengi.
errorColorUIColor?Hata vurgu rengi (ör. kaydı durdurma butonu).
successColorUIColor?Başarı vurgu rengi (ör. onay butonları).
textPrimaryColorUIColor?Tek başına duran birincil metinlerin rengi (ör. hologram geri sayım sayacı).
textSecondaryColorUIColor?İkincil ipucu metinlerinin rengi (ör. görüntülü beyan açıklaması). Geriye dönük uyumluluk için bulletTextColor'dan bağımsızdır.
lineButtonTextColorUIColor?Çerçeveli (line) butonların metin rengi. Bu butonlar saydam bir yüzey üzerinde durduğu için primaryColor'dan bağımsız tutulmuştur.

ShapesConfig Özellikleri

ParametreTipAçıklama
buttonCornerRadiusInt?Butonların köşe yarıçapını belirler.
cardCornerRadiusInt?Ekran içi uyarı kartlarının ve ipucu kutularının köşe yarıçapını belirler.
imageFrameCornerRadiusInt?Görsel ve animasyon çerçevelerinin köşe yarıçapını belirler.
bottomSheetCornerRadiusInt?Bottom sheet'lerin üst köşelerinin yarıçapını belirler.

TextConfig Özellikleri

ParametreTipAçıklama
approveButtonTextString?Fotoğraf çekildikten veya video kaydedildikten sonra gösterilen onay butonunun metni.
retakeButtonTextString?Fotoğraf çekildikten veya video kaydedildikten sonra gösterilen yeniden çekme butonunun metni.
startButtonTextString?Görüntülü beyan ekranındaki "kaydı başlat" butonunun metni.
stopButtonTextString?Görüntülü beyan ekranındaki "kaydı durdur" butonunun metni.
not

Buradaki metinler SDK genelinde geçerlidir. Adım bazında farklı bir metin göstermek için StepBuilder üzerindeki setApproveButtonText, setRetakeButtonText, setStartButtonText ve setStopButtonText metotlarını kullanın; bunlar TextConfig değerlerini ezer.

TypographyConfig Özellikleri

ParametreTipAçıklama
fontFamilyString?SDK genelinde kullanılacak font family adını belirtir. Örnek: "Inter", "Inter-Regular", "Roboto".
titleFontSizeCGFloatBaşlık metinlerinde kullanılacak font boyutunu belirtir. Varsayılan değer: 28.
bodyFontSizeCGFloatGövde metinlerinde kullanılacak font boyutunu belirtir. Varsayılan değer: 16.
buttonFontSizeCGFloatButon metinlerinde kullanılacak font boyutunu belirtir. Varsayılan değer: 16.
labelFontSizeCGFloatKüçük yardımcı label metinlerinde ve ışık denetimi uyarılarında kullanılacak font boyutunu belirtir. Varsayılan değer: 14.
timerFontSizeCGFloatSayaç metinlerinde kullanılacak font boyutunu belirtir. Varsayılan değer: 32.
promptFontSizeCGFloatGörüntülü beyan adımında okunacak metnin font boyutunu belirtir. Varsayılan değer: 16.
titleFontWeightIntBaşlık metinlerinde kullanılacak font kalınlığını belirtir. Desteklenen değerler: 100, 400, 500, 700, 900. Varsayılan değer: 700.
bodyFontWeightIntGövde, label ve buton metinlerinde kullanılacak font kalınlığını belirtir. Desteklenen değerler: 100, 400, 500, 700, 900. Varsayılan değer: 400.
promptFontWeightIntGörüntülü beyan adımında okunacak metnin font kalınlığını belirtir. Varsayılan değer: 600.

UIConfig Kullanım Örneği

let colorsConfig = ColorsConfig(buttonColor: UIColor(named: "purple_700"),
buttonTextColor: .white,
bulletTextColor: UIColor(named: "teal_700"),
titleColor: .label,
descriptionColor: .secondaryLabel,
primaryColor: UIColor(named: "purple_700"),
onPrimaryColor: .white,
surfaceColor: .systemBackground,
onSurfaceColor: .label,
backgroundColor: .systemBackground,
errorColor: .systemRed,
successColor: .systemGreen,
textPrimaryColor: .label,
textSecondaryColor: .secondaryLabel,
lineButtonTextColor: UIColor(named: "purple_700")
)

let shapesConfig = ShapesConfig(buttonCornerRadius: 30,
cardCornerRadius: 12,
imageFrameCornerRadius: 16,
bottomSheetCornerRadius: 24
)

let typographyConfig = TypographyConfig(fontFamily: "Inter",
titleFontSize: 28,
bodyFontSize: 16,
buttonFontSize: 16,
labelFontSize: 14,
timerFontSize: 32,
promptFontSize: 16,
titleFontWeight: 700,
bodyFontWeight: 400,
promptFontWeight: 600
)

let uiConfig = UIConfig(colors: colorsConfig,
typography: typographyConfig,
shapes: shapesConfig,
bulletIconName: "bullet_icon",
textConfig: TextConfig(approveButtonText: "Onayla",
retakeButtonText: "Yeniden Çek",
startButtonText: "Kayda Başla",
stopButtonText: "Kaydı Durdur")
)

KYCManagerConfigBuilder ile Kullanımı

    static let configuration = KYCManagerConfigBuilder()
.setCameraErrorMessage([
.CAMERA_PERMISSION_DENIED: "Kamera izni verilmedi. lütfen Kamera izni verin"
])
.setShowCompletedScreen(true)
.setVideoCallSplashScreenAssetName("IdCard")
.setVideoCallExternalLogoImage(UIImage(named: "IdCard"))
.setTTSConfig(defaultTTSConfig)
.setUIConfig(UIConfig(colors: ColorsConfig(buttonColor: .systemPink,
buttonTextColor: .white,
bulletTextColor: .black),
typography: TypographyConfig(fontFamily: "Luculine",
titleFontSize: 28,
bodyFontSize: 27,
buttonFontSize: 16,
labelFontSize: 14,
timerFontSize: 32,
promptFontSize: 16,
titleFontWeight: 700,
bodyFontWeight: 400,
promptFontWeight: 600),
shapes: ShapesConfig(buttonCornerRadius: 24),
textConfig: TextConfig(approveButtonText: "Onayla",
retakeButtonText: "Yeniden Çek")))
.build()

TTSConfig

Adım başlangıçlarında ve liveness yönergelerinde kullanılan sesli okuma (text-to-speech) davranışını yapılandırır. KYCManagerConfigBuilder.setTTSConfig(_:) ile verilir.

TTSConfig Özellikleri

ParametreTipAçıklama
isEnabledBoolSesli okumanın etkin olup olmadığını belirtir. Varsayılan: true.
languageStringvoiceIdentifier bulunamadığında varsayılan sesin seçileceği BCP-47 dil kodu. Örnek: "tr-TR", "en-US", "ru-RU". Varsayılan: "tr-TR".
voiceIdentifierString?Tercih edilen AVSpeechSynthesisVoice tanımlayıcısı. Cihazda yüklüyse doğrudan kullanılır; bulunamazsa language için varsayılan sese düşülür. Varsayılan: nil.
speechRateFloatKonuşma hızı. Aralık: 0.01.0. Varsayılan: 0.5. Anadili olmayan seslerde (ör. Rusça compact ses) 0.4 gibi düşük değerler anlaşılırlığı artırır.
volumeFloatSes seviyesi. Aralık: 0.0 (sessiz) – 1.0 (tam). Varsayılan: 1.0.
pitchMultiplierFloatSes tonu. Aralık: 0.5 (kalın) – 2.0 (ince). Aralık dışındaki değerler iOS tarafından sınırlanır. Varsayılan: 1.0.
preUtteranceDelayTimeIntervalKonuşma başlamadan önce eklenen sessizlik (saniye). Varsayılan: 0.0.
postUtteranceDelayTimeIntervalKonuşma bittikten sonra eklenen sessizlik (saniye). Varsayılan: 0.0.
let ttsConfig = TTSConfig(
isEnabled: true,
language: "tr-TR",
speechRate: 0.5,
volume: 1.0,
pitchMultiplier: 1.0,
preUtteranceDelay: 0.0,
postUtteranceDelay: 0.0
)

WarningConfig

Işık koşullarına bağlı uyarı toast mesajlarının gösterilip gösterilmeyeceğini ve metnini belirler. İki uyarı ayrı ayrı yapılandırılır:

YapılandırmaNe zaman gösterilir
setOverexposureWarning(_:)Çekilen görüntü aşırı aydınlık olduğunda veya kimlik üzerinde fazla ışık yansıması olduğunda.
setLowLightWarning(_:)Canlılık adımında ortam ışığı yüz hareketlerini algılamak için yetersiz olduğunda.
CaseAçıklama
.enabled(message: String?)Uyarıyı açar. message verilmezse SDK'nın kendi lokalize metni gösterilir.
.disabledUyarıyı kapatır; kullanıcıya gösterilmez. Varsayılan davranış budur.
let configuration = KYCManagerConfigBuilder()
.setOverexposureWarning(.enabled(message: "Ortam çok aydınlık, lütfen ışığı azaltın."))
.setLowLightWarning(.enabled())
.build()

CompletedScreenTexts

showCompletedScreen açıkken akışın sonunda gösterilen başarı ekranının metinlerini özelleştirir. Verilmeyen alanlar için SDK'nın lokalize varsayılanları kullanılır.

ParametreTipAçıklama
titleTextString?Başarı ekranındaki ana başlık.
descriptionTextString?Görselin altında gösterilen açıklama metni.
buttonTextString?Onay butonunun metni.
let completedTexts = CompletedScreenTexts(
titleText: "İşleminiz tamamlandı",
descriptionText: "Kimlik doğrulama başvurunuz başarıyla alındı.",
buttonText: "Tamam"
)

KYCManagerConfig

KYC akışının genel davranışını, hata mesajlarını ve UI yapılandırmasını belirler.

KYCManagerConfig Parametreleri

ParametreTipAçıklama
languageStringSDK'nın kendi metinlerinin dili. Desteklenen değerler: "tr", "en", "ru". Varsayılan: "tr".
uiConfigUIConfig?SDK genelindeki renk, tipografi, şekil ve metin ayarlarını özelleştirir.
showCompletedScreenBoolAkış başarıyla tamamlandığında başarı ekranının gösterilip gösterilmeyeceğini belirler. Varsayılan: false.
completedScreenTextsCompletedScreenTexts?Başarı ekranındaki başlık, açıklama ve buton metinlerini özelleştirir.
livenessConfigLivenessConfig?Canlılık adımındaki talimatları ve görsel stili özelleştirir.
ttsConfigTTSConfig?Sesli okuma (text-to-speech) davranışını özelleştirir.
videoCallSplashScreenAssetNameString?Video görüşme ekranı açıldığında gösterilen tam ekran görselin asset adı.
videoCallExternalLogoImageUIImage?Video görüşme ekranında gösterilen logo.
closeIconAssetNameString?Info ekranlarındaki kapatma butonunun asset adı.
overexposureWarningConfigWarningConfigAşırı aydınlık / ışık yansıması uyarısının yapılandırması. Varsayılan: .disabled.
lowLightWarningConfigWarningConfigCanlılık adımında düşük ışık uyarısının yapılandırması. Varsayılan: .disabled.
securityCheckEnabledBoolJailbreak / simülatör / debugger / hooking tespitini açar. Varsayılan: false.
cameraErrorMessage[TeydexError.CameraSourceError: String]?Kamera hataları için özel mesaj sözlüğü.
nfcErrorMessage[TeydexError.NFCError: String]?NFC hataları için özel mesaj sözlüğü.
videoCallErrorMessage[TeydexError.VideoCallError: String]?Video görüşme hataları için özel mesaj sözlüğü.
videoRecordErrorMessage[TeydexError.VideoRecordError: String]?Görüntülü beyan hataları için özel mesaj sözlüğü.
timeOutErrorMessage[TeydexError.TimeOutError: String]?Zaman aşımı hataları için özel mesaj sözlüğü.
serverErrorMessage[TeydexError.ServerError: String]?Sunucu hataları için özel mesaj sözlüğü.
rejectedErrorMessage[TeydexError.RejectedError: String]?Reddedilme hataları için özel mesaj sözlüğü.
identityReadFailedError[TeydexError.IdentityReadFailedError: String]?Kimlik okuma hataları için özel mesaj sözlüğü.
documentAutoDetectError[TeydexError.DocumentAutoDetectError: String]?Belge otomatik algılama hataları için özel mesaj sözlüğü.

KYCManagerConfigBuilder Metotları

KYCManagerConfig doğrudan da oluşturulabilir; önerilen yöntem KYCManagerConfigBuilder kullanmaktır. Tüm setter'lar zincirlenebilir ve build() ile yapılandırma tamamlanır.

MetotKarşılık geldiği alan
setLanguage(_:)language
setUIConfig(_:)uiConfig
setShowCompletedScreen(_:)showCompletedScreen
setCompletedScreenTexts(_:)completedScreenTexts
setLivenessConfig(_:)livenessConfig
setTTSConfig(_:)ttsConfig
setVideoCallSplashScreenAssetName(_:)videoCallSplashScreenAssetName
setVideoCallExternalLogoImage(_:)videoCallExternalLogoImage
setCloseIconAssetName(_:)closeIconAssetName
setOverexposureWarning(_:)overexposureWarningConfig
setLowLightWarning(_:)lowLightWarningConfig
setSecurityCheckEnabled(_:)securityCheckEnabled
setCameraErrorMessage(_:)cameraErrorMessage
setNFCErrorMessage(_:)nfcErrorMessage
setVideoCallErrorMessage(_:)videoCallErrorMessage
setVideoRecordErrorMessage(_:)videoRecordErrorMessage
setTimeOutErrorMessage(_:)timeOutErrorMessage
setServerErrorMessage(_:)serverErrorMessage
setRejectedErrorMessage(_:)rejectedErrorMessage
setIdentityReadFailedError(_:)identityReadFailedError
setDocumentAutoDetectMessage(_:)documentAutoDetectError
setNetworkErrorMessage(_:)Ağ hatası mesajları (yalnızca onError üzerinden okunur)
setPermissionErrorMessage(_:)İzin hatası mesajları (yalnızca onError üzerinden okunur)
setSecurityErrorMessage(_:)Güvenlik hatası mesajları (yalnızca onError üzerinden okunur)

Güvenlik Kontrolü (Jailbreak / Hook Tespiti)

setSecurityCheckEnabled(true) çağrıldığında SDK; jailbreak, simülatör, debugger ve hooking (Frida, Cydia Substrate vb.) tespiti yapar. Kontrol varsayılan olarak kapalıdır ve açılmadığı sürece hiç çalışmaz.

Kontrol her çalıştığında — cihaz temiz olsun ya da olmasın — onEvent üzerinden tam olarak bir olay üretir. Böylece "kontrol hiç çalışmadı" ile "kontrol çalıştı, cihaz temiz" durumu birbirinden ayrılabilir:

DurumOlayEk davranış
Cihaz temizLogState.securityCheckPassed (SECURITY_CHECK_PASSED)Akış normal şekilde devam eder.
Cihaz kompromizeLogState.securityWarning (SECURITY_WARNING)Akış hata ekranıyla durdurulur; onError ve onProcessFinished(.failed(...)) tetiklenir.
let configuration = KYCManagerConfigBuilder()
.setSecurityCheckEnabled(true)
.setSecurityErrorMessage([.DEVICE_COMPROMISED: "Cihazınız güvenli değil. Lütfen farklı bir cihaz ile deneyin."])
.build()
not

Engelleme davranışı, dağıtılan KYCFramework.xcframework'ün Release olarak derlenmiş olmasına bağlıdır. Yayınlanan xcframework her zaman Release derlendiği için, SDK'yı kullanan uygulamanın kendi Debug/Release şeması fark etmeksizin kompromize cihazlarda engelleme her zaman aktiftir.

KYCManagerConfig Kullanımı

let configuration = KYCManagerConfigBuilder()
.setCameraErrorMessage([.CAMERA_PERMISSION_DENIED: "Kamera izni reddedildi"])
.setNFCErrorMessage([.DEVICE_NOT_HAVE_NFC: "Cihazınızda NFC bulunmuyor"])
.setShowCompletedScreen(true)
.setVideoCallSplashScreenAssetName("splash_background")
.setCloseIconAssetName("close_icon")
.setLivenessConfig(livenessConfig)
.setUIConfig(uiConfig)
.setTTSConfig(TTSConfig(isEnabled: true, speechRate: 0.5, language: "tr-TR"))
.setVideoCallExternalLogoImage(UIImage(named: "your_logo") ?? UIImage())
.setUIConfig(UIConfig(colors: ColorsConfig(buttonColor: .systemPink,
buttonTextColor: .white,
bulletTextColor: .black),
typography: TypographyConfig(fontFamily: "Luculine",
titleFontSize: 28,
bodyFontSize: 27,
buttonFontSize: 16,
labelFontSize: 14,
timerFontSize: 32,
promptFontSize: 16,
titleFontWeight: 700,
bodyFontWeight: 400,
promptFontWeight: 600),
shapes: ShapesConfig(buttonCornerRadius: 24),
textConfig: TextConfig(approveButtonText: "Onayla",
retakeButtonText: "Yeniden Çek")))
.build()

Lokalizasyon

SDK, kendi arayüz metinlerini üç dilde destekler. Dil seçimi setLanguage ile yapılır ve varsayılan değer "tr"'dir.

DilKod
Türkçe"tr"
İngilizce"en"
Rusça"ru"
let configuration = KYCManagerConfigBuilder()
.setLanguage("ru")
.build()

SDK'nın Lokalize Ettiği Metinler

setLanguage yalnızca SDK'nın kendi ürettiği metinleri etkiler:

  • Hata başlık ve mesajları (kamera, NFC, sunucu, zaman aşımı vb.)
  • Kamera izin ekranı başlık ve butonları
  • Canlılık yönerge metinleri (yukarı, aşağı, sola, sağa, yüzünüzü ortalayın vb.)
  • NFC okuma ekranı mesajları
  • Bağlantı hatası ekranı
  • Başarı ve iptal ekranları
  • "Tamam", "İzin Ver", "Vazgeç", "Yeniden Çek", "Onayla" gibi SDK butonları

Entegratörün Sorumluluğunda Olan Metinler

Aşağıdaki metinler entegratör tarafından sağlandığı için setLanguage'den etkilenmez; bunları kendi lokalizasyon altyapınızla yönetmeniz gerekir:

  • InfoPresentationModelBuilder ile verilen başlık, açıklama, madde ve buton metinleri
  • StepBuilder.setTitle() ile verilen adım başlıkları
  • StepBuilder üzerindeki glare / parlaklık uyarı metinleri
  • NFCTextConfig ile override edilen NFC metinleri
  • LivenessConfig ile override edilen canlılık metinleri
  • CompletedScreenTexts ile override edilen başarı ekranı metinleri
  • Sesli okuma (TTS) içerikleri

KYCManagerDelegate

KYC sürecindeki olayları ve hataları yönetmek için kullanılan delegate protokolü.

import KYCFramework

class ViewController: UIViewController, KYCManagerDelegate {

func onProcessFinished(_ result: KYCProcessResult) {
// KYC akışı herhangi bir sebeple sona erdiğinde bir kez çağrılır.
switch result {
case .successful:
print("KYC süreci başarıyla tamamlandı")
case .failed(let step, let reason):
print("KYC başarısız — adım: \(String(describing: step)), sebep: \(reason)")
case .cancelled(let step, let reason):
print("KYC iptal edildi — adım: \(String(describing: step)), sebep: \(reason)")
}
}

func onCompletion(_ isSuccess: Bool) {
// Kimlik doğrulama adımının başarılı olup olmadığını bu fonksiyon aracılığıyla dinleyebilirsiniz.
if isSuccess {
print("KYC süreci başarıyla tamamlandı")
} else {
print("KYC süreci başarısız oldu")
}
}

// onEvent ve onError fonksiyonları, kimlik doğrulama sürecinde hangi adımların açıldığını,
// hangi işlemlerin gerçekleştirildiğini ve oluşan hata durumlarını ele almanıza olanak tanır.
// Bu fonksiyonlar, Countly ve Firebase gibi platformlara loglama için gerekli bilgileri sağlar.

func onEvent(_ event: LogState) {
print("KYC Event: \(event)")
}

func onError(_ error: TeydexError) {
print("KYC Error: \(error)")
}

override func viewDidLoad() {
super.viewDidLoad()
TeydexSDK.shared.kycManager.delegate = self
}
}

Olaylar (LogState)

KYCManagerDelegate.onEvent(_ event: LogState) ile akış boyunca üretilen olaylar entegratöre iletilir. Bu olaylar Countly, Firebase gibi platformlara loglama için kullanılabilir. LogState bir String raw value taşır; tablodaki ikinci sütun bu değerdir.

Adım Olayları

CaseRaw value
idCardFrontStepOpenedID_CARD_FRONT_STEP_OPENED
idCardBackStepOpenedID_CARD_BACK_STEP_OPENED
idCardHologramStepOpenedID_CARD_HOLOGRAM_STEP_OPENED
idCardNfcStepOpenedID_CARD_NFC_STEP_OPENED
idCardLivenessStepOpenedID_CARD_LIVENESS_STEP_OPENED
passportStepOpenedPASSPORT_STEP_OPENED
ruPassportAddressValidationStepOpenedRU_PASSPORT_ADDRESS_VALIDATION_STEP_OPENED
videoCallStepOpenedVIDEO_CALL_STEP_OPENED
videoRecordStepOpenedVIDEO_RECORD_STEP_OPENED
selfieStepOpenedSELFIE_STEP_OPENED
kpsStepOpenedKPS_STEP_OPENED
stepSkippedSTEP_SKIPPED

Akış Durumu Olayları

CaseRaw value
kycCompletedKYC_COMPLETED
kycFailedKYC_FAILED
kycCancelledKYC_CANCELLED
kycClosedKYC_CLOSED
kycRetryKYC_RETRY
kycMaxRetryReachedKYC_MAX_RETRY_REACHED
kycCloseButtonClickedKYC_CLOSE_BUTTON_CLICKED
kycNfcCloseButtonClickedKYC_NFC_CLOSE_BUTTON_CLICKED
kycVideoCallClosedKYC_VIDEO_CALL_CLOSED

İzin ve Güvenlik Olayları

CaseRaw value
cameraPermissionGrantedCAMERA_PERMISSION_GRANTED
microphonePermissionGrantedMICROPHONE_PERMISSION_GRANTED
securityCheckPassedSECURITY_CHECK_PASSED
securityWarningSECURITY_WARNING

Belge Algılama Olayları

CaseRaw value
scanningDetectionTooDarkSCANNING_DETECTION_TOO_DARK
scanningDetectionTooBrightSCANNING_DETECTION_TOO_BRIGHT
scanningDetectionGlareDetectedSCANNING_DETECTION_GLARE_DETECTED
scanningDetectionGlareNotDetectedSCANNING_DETECTION_GLARE_NOT_DETECTED
scanningDetectionMultipleDocumentsDetectedSCANNING_DETECTION_MULTIPLE_DOCUMENTS_DETECTED
scanningDetectionUnknownErrorSCANNING_DETECTION_UNKNOWN_ERROR

Diğer Olaylar

CaseRaw value
hologramVideoIsSavedHOLOGRAM_VIDEO_IS_SAVED
hologramRetryHOLOGRAM_RETRY
nfcMrzContentNFC_MRZ_CONTENT
mrzDataNotFoundMRZ_DATA_NOT_FOUND
processNfcIntentHasFailedPROCESS_NFC_INTENT_HAS_FAILED
joinVideoCallQueJOIN_QUEUE
videoCallStartFailedVIDEO_CALL_START_FAILED
imageCompressFailedIMAGE_COMPRESS_FAILED
imageNotFoundIMAGE_NOT_FOUND
convertDateFailedCONVERT_DATE_FAILED

onError Closure'u

Delegate'e ek olarak, hataları closure ile de dinleyebilirsiniz. KYCManager.onError delegate'in onError(_:) metodundan bağımsız çalışır; ikisini birlikte de kullanabilirsiniz.

TeydexSDK.shared.kycManager.onError = { error in
print("KYC Error: \(error.title)\(error.message)")
}

dismissKYC

KYC akışını SDK dışından programatik olarak kapatmak için kullanılır. Çağrıldığında onProcessFinished delegate metodu .cancelled(reason: .programmatic) ile tetiklenir.

onProcessFinished

KYC akışının sonucunu üç case ile raporlar:

CaseAçıklama
.successfulTüm adımlar başarıyla tamamlandı.
.failed(stepName: String?, reason: String)Belirtilen adımda hata nedeniyle akış sonlandı.
.cancelled(stepName: String?, reason: KYCCancelReason)Akış iptal edildi. Sebep KYCCancelReason ile raporlanır.

KYCCancelReason

CaseAçıklama
.userRequestedKullanıcı akış içindeki kapatma/iptal butonuna bastı.
.programmaticEntegratör dismissKYC() çağırarak akışı kapattı.
.serverCancelledSunucu işlemi iptal edilmiş olarak bildirdi.
kycManager.dismissKYC()

KYC Akışını Başlatma

enterKYC Fonksiyonu

TeydexSDK.shared.kycManager.enterKYC(
from: viewController, // UIViewController veya UINavigationController
clientToken: token, // Kimlik doğrulama için benzersiz token
applicationId: applicationId, // Kimlik doğrulama için uygulama ID'si
stepList: stepList, // Adım listesi
configuration: configuration, // KYCManagerConfig (opsiyonel)
initializeUrl: "https://your.api.domain.com/api/v1", // API base URL
videoCallUrl: "https://your.videocall.domain.com/api/v1", // Video görüşme servis URL'i
roomName: nil, // Görüşme oda adı (opsiyonel). Varsayılan: nil
useLocation: false // Konum bilgisi kaydedilsin mi? Varsayılan: false
)
ParametreTipAçıklama
fromUIViewControllerAkışın başlatılacağı ekran.
clientTokenStringKimlik doğrulama için üretilen benzersiz token.
applicationIdStringKimlik doğrulama için üretilen uygulama ID'si.
stepList[Step]Adım yapılandırmalarının listesi.
configurationKYCManagerConfig?SDK yapılandırması. Opsiyoneldir.
initializeUrlStringAPI base URL. Örnek: "https://your.domain.com/api/v1".
videoCallUrlStringVideo görüşme servislerinin base URL'i.
roomNameString?Video görüşme isteklerinde randevu tanımlayıcısı olarak kullanılan oda adı. Varsayılan: nil.
useLocationBoolKonum bilgisinin kaydedilip kaydedilmeyeceği. Varsayılan: false. true verildiğinde Info.plist içindeki konum anahtarlarının tanımlı olması gerekir.

Önemli: from parametresine bir UINavigationController veya navigationController'ı olan bir UIViewController verilmelidir.

warning

from parametresi almayan eski enterKYC(clientToken:...) imzası deprecated'dir. Yeni entegrasyonlarda enterKYC(from:...) kullanılmalıdır.

Sertifika Sabitleme (Certificate Pinning)

SDK'nın yaptığı ağ isteklerinde sertifika sabitlemesi kullanmak için, akışı başlatmadan önce setPinnedCertificate çağrılır. Sertifika uzaktan bir URL'den ya da uygulama bundle'ına gömülü bir dosyadan yüklenebilir.

// Bundle'a gömülü sertifika ile
TeydexSDK.shared.kycManager.setPinnedCertificate(orEmbeddedFile: "your_certificate", isPEM: false)

// Uzak URL'den
TeydexSDK.shared.kycManager.setPinnedCertificate(from: URL(string: "https://your.domain.com/cert.der"))
ParametreTipAçıklama
fromURL?Sertifikanın indirileceği URL.
orEmbeddedFileString?Uygulama bundle'ına gömülü sertifika dosyasının adı.
isPEMBoolSertifikanın PEM formatında olup olmadığı. Varsayılan: false (DER).

Tam Konfigürasyon Örneği

class KYCConfig {

// Front Info
static let frontInfo = InfoPresentationModelBuilder()
.setButtonText("Devam")
.setDescriptionText("Lütfen aşağıdaki adımları dikkatlice takip ediniz")
.setTitleText("Ön Yüz")
.setBullets(["Kimliğinizin ön yüzünü, telefon ekranına paralel bir şekilde tutun. Kimlik, ekranda görünen şablonun içine tam olarak yerleşecek şekilde konumlandırılmalıdır.",
"Kimlik üzerindeki tüm bilgilerin net bir şekilde göründüğünden emin olun. Kimlik bilgileri bulanık olmamalı ve kolayca okunabilir olmalıdır."])
.setCancelButtonIsActive(true)
.build()

// Back Info
static let backInfo = InfoPresentationModelBuilder()
.setButtonText("Devam")
.setDescriptionText("Lütfen aşağıdaki adımları dikkatlice takip ediniz")
.setTitleText("Arka Yüz")
.setBullets(["Kimliğinizin arka yüzünü, telefon ekranına paralel bir şekilde tutun. Kimlik, ekranda görünen şablonun içine tam olarak yerleşecek şekilde konumlandırılmalıdır.",
"Kimlik üzerindeki tüm bilgilerin net bir şekilde göründüğünden emin olun. Kimlik bilgileri bulanık olmamalı ve kolayca okunabilir olmalıdır."])
.setCancelButtonIsActive(true)
.build()

// NFC Info
static let nfcInfo = InfoPresentationModelBuilder()
.setButtonText("Devam")
.setDescriptionText("Lütfen aşağıdaki adımları dikkatlice takip ediniz")
.setTitleText("NFC")
.setBullets(["Telefonunuzda NFC özelliğinin açık olduğundan emin olun. NFC, telefonunuzun ayarlar kısmından etkinleştirilebilir.",
"Kimliğinizin NFC uyumlu alanını telefonunuzun arkasına temas ettirin. Kimlik ve telefon arasındaki mesafe mümkün olduğunca kısa olmalıdır.",
"Kimlik verilerinin telefonunuza başarılı bir şekilde aktarılmasını bekleyin. Telefonunuz NFC sinyalini aldığında, ekranınızda kimlik doğrulama işlemi başladığına dair bir bildirim görünmelidir."])
.setCancelButtonIsActive(true)
.build()

// Liveness Info
static let faceInfo = InfoPresentationModelBuilder()
.setButtonText("Devam")
.setDescriptionText("Lütfen aşağıdaki adımları dikkatlice takip ediniz")
.setTitleText("Canlılık")
.setBullets(["Cihazınızın kamerasına doğru bakın ve yüzünüzün ekranda net bir şekilde görünmesini sağlayın. Cihazınızın ekranındaki talimatlara uyarak, başınızı belirli bir şekilde hareket ettirmeniz gerekebilir.",
"Ekranda beliren yönergeler doğrultusunda, başınızı sağa, sola, yukarı ve aşağı çevirebilir. Yüzünüzün doğal ve canlı görünmesi gerektiğini unutmayın."])
.setCancelButtonIsActive(true)
.build()

// Hologram Info
static let hologramInfo = InfoPresentationModelBuilder()
.setButtonText("Devam")
.setDescriptionText("Lütfen aşağıdaki adımları dikkatlice takip ediniz")
.setTitleText("Hologram")
.setBullets(["Kimliğinizin ön yüzünü, ekranda verilen süre içinde net bir şekilde yerleştirin. Kimliğinizin üzerinde bulunan hologram etiketinin parlak yansımasını düzgün bir şekilde kaydetmeniz gerekmektedir.",
"Kimlik bilgilerinizi net bir şekilde görebileceğinizden emin olun. Kimlik üzerindeki tüm bilgilerin kayda alınabilmesi için yeterince aydınlık ve belirgin olmasına dikkat edin."])
.setCancelButtonIsActive(true)
.build()

// VideoCall Info
static let videoCallInfo = InfoPresentationModelBuilder()
.setButtonText("Devam")
.setDescriptionText("Yüzünü taramak için hazır olun ve ışığı yüksek bir alana geçin.")
.setTitleText("Görüntülü Görüşme")
.setBullets(["Cihazınızın kamera ve mikrofonunun çalıştığından emin olun.",
"Yüzünüzün net görünmesi için yeterli ışık sağladığınızdan emin olun."])
.setCancelButtonIsActive(true)
.build()

// VideoRecord Info
static let videoRecordInfo = InfoPresentationModelBuilder()
.setButtonText("Devam")
.setDescriptionText("Ekranda gösterilen metni yüksek sesle okuyarak video kaydı oluşturun.")
.setTitleText("Sesli Video Doğrulama")
.setBullets(["Yüzünüzün kamera karesinin ortasında ve net bir şekilde görünmesini sağlayın.",
"Kayıt sırasında ekranda gösterilen metni yüksek sesle ve anlaşılır bir şekilde okuyun."])
.setCancelButtonIsActive(true)
.build()


// Steps
static let idFrontStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Kimlik Ön Yüz")
.setInfoView(frontInfo)
.setStepType(.idcardFront)
.setStepInformationTextToSpeech("Kimliğinizin ön yüzünü telefon ekranına paralel tutun. Kimlik şablonun içine tam olarak yerleştirilmelidir.")
.setIsGlareDetectionEnable(true)
.setGlareDetectedText("Işık yansıması var. Lütfen belgeyi farklı bir açıyla tutun.")
.setTooBrightText("Ortam çok aydınlık. Lütfen ışığı azaltın.")
.setTooDarkText("Ortam çok karanlık. Lütfen aydınlık bir ortama geçin.")
.setMultipleDocumentsDetectedText("Sadece tek belge gösterin.")
.build()

static let idBackStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Arka Yüz")
.setInfoView(backInfo)
.setStepType(.idcardBack)
.setStepInformationTextToSpeech("Kimliğinizin arka yüzünü telefon ekranına paralel tutun. Tüm bilgilerin net görünmesini sağlayın.")
.setIsGlareDetectionEnable(true)
.setGlareDetectedText("Işık yansıması var. Lütfen belgeyi farklı bir açıyla tutun.")
.setTooBrightText("Ortam çok aydınlık. Lütfen ışığı azaltın.")
.setTooDarkText("Ortam çok karanlık. Lütfen aydınlık bir ortama geçin.")
.setMultipleDocumentsDetectedText("Sadece tek belge gösterin.")
.build()

static let nfcStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("NFC")
.setInfoView(nfcInfo)
.setStepType(.nfc)
.setStepInformationTextToSpeech("Kimliğinizi telefonunuzun arkasına yaklaştırın. NFC özelliğinin açık olduğundan emin olun.")
.build()

static let faceStep = LivenessStepBuilder()
.setDirectionTextToSpeech(
center: "Yüzünüzü çerçevenin ortasına tutarak düz bakın.",
right: "Yüzünüzü sağa çevirin.",
left: "Yüzünüzü sola çevirin.",
up: "Yüzünüzü yukarı çevirin.",
down: "Yüzünüzü aşağı çevirin."
)
.setIdentifyTimeout(35)
.setTitle("Canlılık Kontrolü")
.setInfoView(faceInfo)
.setStepInformationTextToSpeech("Kameraya bakın ve yüzünüzü çerçeveye yerleştirin. Başınızı yönlendirmelere göre hareket ettirin.")
.setIsGlareDetectionEnable(true)
.setTooBrightText("Ortam çok aydınlık. Lütfen ışığı azaltın.")
.setTooDarkText("Ortam çok karanlık. Lütfen aydınlık bir ortama geçin.")
.build()

static let hologramStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Hologram")
.setInfoView(hologramInfo)
.setStepType(.hologram)
.setStepInformationTextToSpeech("Kimliğinizin hologram etiketini tarayın. Hologram parlak bir şekilde görünmelidir.")
.build()

static let videoCall = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Video Görüşme")
.setInfoView(videoCallInfo)
.setStepType(.videoCall)
.setStepInformationTextToSpeech("Video görüşme başlatılıyor. Yeterli ışık olduğundan emin olun.")
.build()

static let videoRecordStep = StepBuilder()
.setIdentifyTimeout(35)
.setTitle("Sesli Video Doğrulama")
.setInfoView(videoRecordInfo)
.setStepType(.videoRecord)
.setStepInformationTextToSpeech("Ekranda gösterilen metni yüksek sesle okuyarak video kaydı oluşturun.")
.setStartButtonText("Kayda Başla")
.setStopButtonText("Kaydı Durdur")
.setApproveButtonText("Onayla")
.setRetakeButtonText("Yeniden Kaydet")
.setVideoRecordDuration(30)
.build()


// Text to Speech Configuration
static let defaultTTSConfig = TTSConfig(
isEnabled: true,
language: "tr-TR",
speechRate: 0.5,
volume: 1.0,
pitchMultiplier: 1.0,
preUtteranceDelay: 0.0,
postUtteranceDelay: 0.0
)

// Configuration
static let configuration = KYCManagerConfigBuilder()
.setLanguage("tr")
.setCameraErrorMessage([
.CAMERA_PERMISSION_DENIED: "Kamera izni verilmedi. lütfen Kamera izni verin"
])
.setShowCompletedScreen(true)
.setCompletedScreenTexts(CompletedScreenTexts(titleText: "İşleminiz tamamlandı",
descriptionText: "Kimlik doğrulama başvurunuz başarıyla alındı.",
buttonText: "Tamam"))
.setOverexposureWarning(.enabled(message: "Ortam çok aydınlık, lütfen ışığı azaltın."))
.setLowLightWarning(.enabled())
.setSecurityCheckEnabled(true)
.setVideoCallSplashScreenAssetName("IdCard")
.setVideoCallExternalLogoImage(UIImage(named: "IdCard"))
.setTTSConfig(defaultTTSConfig)
.setUIConfig(UIConfig(colors: ColorsConfig(buttonColor: .systemPink,
buttonTextColor: .white,
bulletTextColor: .black),
typography: TypographyConfig(fontFamily: "Luculine",
titleFontSize: 28,
bodyFontSize: 27,
buttonFontSize: 16,
labelFontSize: 14,
timerFontSize: 32,
promptFontSize: 16,
titleFontWeight: 700,
bodyFontWeight: 400,
promptFontWeight: 600),
shapes: ShapesConfig(buttonCornerRadius: 24),
textConfig: TextConfig(approveButtonText: "Onayla",
retakeButtonText: "Yeniden Çek")))
.build()

// Helper functions
static func getStepList() -> [Step] {
return [idFrontStep, idBackStep, hologramStep, nfcStep, faceStep, videoCall, videoRecordStep]
}

static func getManagerConfig() -> KYCManagerConfig {
return configuration
}
}

Hata Yönetimi

SDK'dan gelebilecek hata tipleri aşağıda listelenmiştir. Tüm hatalar KYCManagerDelegate'in onError(_ error: TeydexError) metodu ile iletilir. Hata mesajları KYCManagerConfigBuilder üzerinden özelleştirilebilir.

Hata Nesnesinin Okunabilir Alanları

TeydexError, KYCBaseError protokolünü uygular. Kendi hata arayüzünüzü göstermek istediğinizde aşağıdaki alanları doğrudan okuyabilirsiniz:

AlanTipAçıklama
titleStringHatanın lokalize başlığı.
messageStringHatanın lokalize mesajı. KYCManagerConfigBuilder ile override edildiyse override edilen değer döner.
extraDetailString?Varsa ek teknik ayrıntı (ör. ilgili endpoint veya sistem hata metni). Çoğu hata için nil'dir.

KYCBaseError, LocalizedError'dan türediği için errorDescription (message döner) ve failureReason (title döner) da kullanılabilir.

func onError(_ error: TeydexError) {
showAlert(title: error.title, message: error.message)
if let detail = error.extraDetail {
analytics.log(detail)
}
}

Kamera Hataları (TeydexError.CameraSourceError)

CaseAçıklama
CAMERA_PERMISSION_DENIEDKamera izni reddedildi.
CAMERA_PERMISSION_PERMANENTLY_DENIEDKamera izni kalıcı olarak reddedildi.
CAMERA_NOT_FOUNDCihazda kamera bulunamadı.
CAMERA_CONFIGURATION_FAILEDKamera yapılandırılamadı veya ön izleme oluşturulamadı.
CAPTURE_PHOTO_FAILEDFotoğraf çekilirken hata oluştu.
VIDEO_RECORDING_FAILEDVideo kaydedilirken hata oluştu.
VIDEO_DELETE_FAILEDGeçici video silinemedi.
FLASH_TOGGLE_FAILEDFlaş açma/kapama işlemi başarısız oldu.
FACE_DETECTION_FAILEDYüz algılama başarısız oldu.
APP_WENT_BACKGROUNDUygulama arka plana alındığı için işlem kesildi.
UNKNOWNBilinmeyen kamera hatası.

NFC Hataları (TeydexError.NFCError)

CaseAçıklama
DEVICE_NOT_HAVE_NFCCihazda NFC modülü bulunmuyor.
NFC_NOT_ENABLEDNFC kapalı.
NFC_READ_FAILEDKimlik bilgisi okunamadı.
TAG_LOSTOkuma sırasında kimlik ile bağlantı koptu.
TAG_NOT_SUPPORTEDKimlik kartı desteklenmiyor.
ISO_DEP_NOT_SUPPORTEDNFC çipi ISO-DEP protokolünü desteklemiyor.
CANT_CONNECT_NFC_TAGNFC etiketine bağlanılamadı.
MORE_THAN_ONE_TAG_FOUNDBirden fazla NFC etiketi algılandı.
WRONG_MRZ_STRINGMRZ bilgisi doğrulanamadı.
CARD_AUTH_FAILEDKart kimlik doğrulaması başarısız oldu.
PASSIVE_AUTH_FAILEDPasif kimlik doğrulama başarısız oldu.
ID_CARD_CAN_NOT_IDENTIFYKimlik kartı tanımlanamadı.
PHOTO_NOT_FOUNDÇipten fotoğraf verisi alınamadı.
USER_CANCELEDKullanıcı okuma işlemini iptal etti.
UNKNOWNBilinmeyen NFC hatası.

Video Görüşme Hataları (TeydexError.VideoCallError)

CaseAçıklama
CLOSEDKullanıcı görüşmeyi kapattı.
FAILVideo görüşme başarısız sonuçlandı.

Görüntülü Beyan Hataları (TeydexError.VideoRecordError)

CaseAçıklama
TIME_OUTKayıt için tanımlanan süre doldu.
RECORDING_FAILEDVideo kaydı tamamlanamadı.
NO_DATAKayıt sonunda video verisi elde edilemedi.

Belge Algılama Hataları (TeydexError.DocumentAutoDetectError)

CaseAçıklama
MULTIPLE_DOCUMENTS_DETECTEDKamerada birden fazla belge algılandı.
GLARE_DETECTEDBelge üzerinde ışık yansıması algılandı.
GLARE_NOT_DETECTEDHologram adımında beklenen yansıma algılanamadı.
TOO_BRIGHTOrtam çok aydınlık.
TOO_DARKOrtam çok karanlık.
UNKNOWNBilinmeyen belge algılama hatası.

Timeout Hataları (TeydexError.TimeOutError)

CaseAçıklama
TIME_OUTİşlem zaman aşımına uğradı.

Sunucu Hataları (TeydexError.ServerError)

CaseAçıklama
UNKNOWNSunucu ile iletişimde bilinmeyen hata.
UNEXPECTEDBeklenmeyen sunucu hatası.

Red Hataları (TeydexError.RejectedError)

CaseAçıklama
REJECTEDİşlem reddedildi.
MAX_RETRY_COUNT_EXCEEDEDMaksimum deneme sayısı aşıldı.

Kimlik Okuma Hataları (TeydexError.IdentityReadFailedError)

CaseAçıklama
IDENTITY_READ_FAILEDKimlik okunamadı.

İzin Hataları (TeydexError.PermissionError)

CaseAçıklama
RECORD_PERMISSION_DENIED(errorMessage: String)Mikrofon / kayıt izni reddedildi.
LOCATION_PERMISSION_DENIEDKonum izni reddedildi.

Güvenlik Hataları (TeydexError.SecurityError)

CaseAçıklama
DEVICE_COMPROMISEDCihazda jailbreak, hooking veya benzeri bir güvenlik ihlali tespit edildi.

Ağ Hataları (TeydexError.NetworkError)

CaseAçıklama
REQUEST_FAILED(endpoint: String, errorMessage: String)İstek başarısız oldu.
REQUEST_FAILED_WITH_STATUS_CODE(endpoint: String, statusCode: Int)İstek başarısız HTTP durum kodu ile döndü.
DECODING_FAILED(endpoint: String, body: String)Yanıt çözümlenemedi.
NO_DATA(endpoint: String)Yanıt gövdesi boş döndü.
INVALID_RESPONSE_FORMAT(endpoint: String, body: String)Yanıt beklenen formatta değil.
not

PermissionError, SecurityError ve NetworkError aileleri SDK tarafından ekranda gösterilmez; yalnızca onError ile entegratöre iletilir. Bu ailelerin mesajları setPermissionErrorMessage, setSecurityErrorMessage ve setNetworkErrorMessage ile override edilebilir ve override edilen değer error.message üzerinden okunur.