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.
| Platform | Min version |
|---|---|
| iOS | iOS 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
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
| Parametre | Tip | Açıklama |
|---|---|---|
| setTitleText | String | Info ekranında görüntülenecek başlık bilgisini belirtir. |
| setDescriptionText | String | Info ekranında görüntülenecek açıklama metnini belirtir. |
| setButtonText | String | Info ekranında gösterilecek adımı başlatacak butonun metnini belirtir. |
| setAssetImageName | String | Info ekranında gösterilecek görseli belirtir. |
| setLottieFileName | String | Info 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. |
| setCancelButtonIsActive | Bool | Info 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. |
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:
| Parametre | Tip | Açıklama |
|---|---|---|
| isGlareDetectionEnable | Bool | İlgili adımda glare algılamayı etkinleştirir. Front ve Back için varsayılan true, Passport için false. |
| glareDetectedText | String | Belge üzerinde ışık yansıması algılandığında gösterilecek metin. |
| tooBrightText | String | Ortam çok aydınlık olduğunda gösterilecek uyarı metni. |
| tooDarkText | String | Ortam çok karanlık olduğunda gösterilecek uyarı metni. |
| multipleDocumentsDetectedText | String | Kamerada birden fazla belge algılandığında gösterilecek uyarı metni. |
Liveness adımında ise yalnızca ortam ışığına bağlı parametreler bulunur:
| Parametre | Tip | Açıklama |
|---|---|---|
| isGlareDetectionEnable | Bool | Liveness adımında ortam ışığı izlemeyi etkinleştirir. Varsayılan false; izlemenin çalışması için açıkça true verilmelidir. |
| tooBrightText | String | Ortam çok aydınlık olduğunda gösterilecek uyarı metni. |
| tooDarkText | String | Ortam çok karanlık olduğunda gösterilecek uyarı metni. |
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
| Parametre | Tip | Açıklama |
|---|---|---|
| setInfoView | InfoPresentationModel? | İlgili adıma Bilgi ekranı eklemek için kullanılır. İsteğe bağlıdır. |
| setTitle | String? | İlgili adımda görüntülenecek Toolbar metnini temsil eder. |
| setStepType | TeydexConstants.KYCStep? | Adımın tipini belirtir (.idcardFront, .idcardBack, vb.) |
| setStepInformationTextToSpeech | String? | Adım başlangıcında seslendirilecek metni temsil eder. |
| setIdentifyTimeout | TimeInterval? | İlgili adım için timeout süresini belirler. Varsayılan değer 30 saniyedir. |
setIsGlareDetectionEnable | Bool? | Işık yansıması algılamayı etkinleştirir. |
setGlareDetectedText | String? | Işık yansıması algılandığında gösterilecek uyarı. |
setTooBrightText | String? | Ortam çok aydınlık olduğunda gösterilecek uyarı. |
setTooDarkText | String? | Ortam çok karanlık olduğunda gösterilecek uyarı. |
setMultipleDocumentsDetectedText | String? | Birden fazla belge algılandığında gösterilecek uyarı. |
setCancelButtonIsActive | Bool | İlgili adımın yakalama ekranında sağ üstteki kapatma butonunun gösterilip gösterilmeyeceğini belirler. Varsayılan false. |
setApproveButtonText | String? | Yakalama sonrası onay butonunun metni. Verildiğinde UIConfig.textConfig üzerindeki genel değeri ezer. |
setRetakeButtonText | String? | Yakalama sonrası yeniden çekme butonunun metni. Verildiğinde UIConfig.textConfig üzerindeki genel değeri ezer. |
setNFCTextConfig | NFCTextConfig? | Yalnızca .nfc adımında geçerlidir; NFC okuma ekranındaki metinleri özelleştirir. |
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
| Parametre | Tip | Açıklama |
|---|---|---|
| setDirectionTextToSpeech | String, String, String, String, String | center, right, left, up, down yönleri için text-to-speech mesajını belirler |
VideoRecord Step Özellikleri
| Parametre | Tip | Açıklama |
|---|---|---|
| setStartButtonText | String? | Kaydı başlatma butonunun metni. |
| setStopButtonText | String? | Kaydı durdurma butonunun metni. |
| setApproveButtonText | String? | Kayıt sonrası onaylama butonunun metni. |
| setRetakeButtonText | String? | Kayıt sonrası yeniden kaydetme butonunun metni. |
| setVideoRecordDuration | Int? | 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.
| Parametre | Tip | Açıklama |
|---|---|---|
successfulReadText | String? | NFC okuması başarıyla tamamlandığında gösterilen metin. |
scanDescription | String? | Kullanıcıdan kimliğini telefonun arkasına yaklaştırması istenirken gösterilen yönerge. |
retryDescription | String? | 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
setGlareDetectedTextvesetMultipleDocumentsDetectedTextdesteklenmez; yalnızcatooBrightTextvetooDarkTextgeç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.
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,readyCountdownMsgibi zamanlama/kalite parametreleri ile yüz konumlandırma ve yön uyarı metinleri (centerYourFaceText,tooCloseText,moveLeftTextvb.) 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 tipi | Açıklama |
|---|---|
.passport | Pasaport 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. |
.ruAddressValidation | Rus pasaportu adres sayfası fotoğrafının çekildiği doğrulama adımı. |
.kps | Kimlik 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. |
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
| Parametre | Tip | Açıklama |
|---|---|---|
| dotRadius | CGFloat? | Canlılık kontrolü sırasında ekranda görüntülenen noktaların yarıçapını belirtir. |
| dotColor | UIColor? | Canlılık göstergeleri için kullanılan noktaların varsayılan rengini tanımlar. |
| activeDotColor | UIColor? | Canlılık kontrolü sırasında aktif olan noktanın rengini ayarlar. |
| titleText | String? | Canlılık kontrolü sırasında görüntülenen ana başlık metni. |
| upText | String? | Kullanıcının başını yukarı hareket ettirmesi gerektiğinde görüntülenen talimat metni. |
| downText | String? | Kullanıcının başını aşağı hareket ettirmesi gerektiğinde görüntülenen talimat metni. |
| leftText | String? | Kullanıcının başını sola çevirmesi gerektiğinde görüntülenen talimat metni. |
| rightText | String? | Kullanıcının başını sağa çevirmesi gerektiğinde görüntülenen talimat metni. |
| centerYourFaceText | String? | Kullanıcının yüzünü çerçeveye ortalamsını isteyen talimat metni. |
| faceNotDetectedText | String? | Canlılık kontrolü sırasında kullanıcının yüzü algılanmadığında görüntülenen mesaj. |
| overlayText | String? | 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
| Parametre | Tip | Açıklama |
|---|---|---|
| colors | ColorsConfig? | Info ekranları ve bottom sheet'lerde kullanılacak renk ayarlarını yapılandırmak için kullanılır. |
| typography | TypographyConfig? | SDK genelinde kullanılacak font ailesi, font boyutları ve font kalınlıklarını yapılandırmak için kullanılır. |
| shapes | ShapesConfig? | Info ekranları ve bottom sheet'lerde kullanılacak şekil ayarlarını yapılandırmak için kullanılır. |
| bulletIconName | String? | Info ekranları ve bottom sheet'lerde madde işaretleri için kullanılan simgenin adını belirtir. |
| textConfig | TextConfig? | Fotoğraf onay ekranındaki buton metinlerini özelleştirmek için kullanılır. |
ColorsConfig Özellikleri
| Parametre | Tip | Açıklama |
|---|---|---|
| buttonColor | UIColor? | Butonların arka plan rengini belirtir. |
| buttonTextColor | UIColor? | Butonların metin rengini ayarlar. |
| bulletTextColor | UIColor? | Madde işaretli metinlerin rengini tanımlar. |
| titleColor | UIColor? | Info ekranlarındaki başlık metninin rengini tanımlar. |
| descriptionColor | UIColor? | Info ekranlarındaki açıklama metninin rengini tanımlar. |
| primaryColor | UIColor? | 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. |
| onPrimaryColor | UIColor? | primaryColor yüzeyleri üzerinde çizilen içeriğin rengi (ör. yükleniyor göstergesi). |
| surfaceColor | UIColor? | Yüzey bileşenlerinin arka plan rengi: bottom sheet gövdesi ve toast mesajları. |
| onSurfaceColor | UIColor? | surfaceColor bileşenleri üzerindeki metinlerin rengi. |
| backgroundColor | UIColor? | SDK ekranlarının tam ekran arka plan rengi. |
| errorColor | UIColor? | Hata vurgu rengi (ör. kaydı durdurma butonu). |
| successColor | UIColor? | Başarı vurgu rengi (ör. onay butonları). |
| textPrimaryColor | UIColor? | Tek başına duran birincil metinlerin rengi (ör. hologram geri sayım sayacı). |
| textSecondaryColor | UIColor? | İ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. |
| lineButtonTextColor | UIColor? | Ç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
| Parametre | Tip | Açıklama |
|---|---|---|
| buttonCornerRadius | Int? | Butonların köşe yarıçapını belirler. |
| cardCornerRadius | Int? | Ekran içi uyarı kartlarının ve ipucu kutularının köşe yarıçapını belirler. |
| imageFrameCornerRadius | Int? | Görsel ve animasyon çerçevelerinin köşe yarıçapını belirler. |
| bottomSheetCornerRadius | Int? | Bottom sheet'lerin üst köşelerinin yarıçapını belirler. |
TextConfig Özellikleri
| Parametre | Tip | Açıklama |
|---|---|---|
| approveButtonText | String? | Fotoğraf çekildikten veya video kaydedildikten sonra gösterilen onay butonunun metni. |
| retakeButtonText | String? | Fotoğraf çekildikten veya video kaydedildikten sonra gösterilen yeniden çekme butonunun metni. |
| startButtonText | String? | Görüntülü beyan ekranındaki "kaydı başlat" butonunun metni. |
| stopButtonText | String? | Görüntülü beyan ekranındaki "kaydı durdur" butonunun metni. |
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
| Parametre | Tip | Açıklama |
|---|---|---|
| fontFamily | String? | SDK genelinde kullanılacak font family adını belirtir. Örnek: "Inter", "Inter-Regular", "Roboto". |
| titleFontSize | CGFloat | Başlık metinlerinde kullanılacak font boyutunu belirtir. Varsayılan değer: 28. |
| bodyFontSize | CGFloat | Gövde metinlerinde kullanılacak font boyutunu belirtir. Varsayılan değer: 16. |
| buttonFontSize | CGFloat | Buton metinlerinde kullanılacak font boyutunu belirtir. Varsayılan değer: 16. |
| labelFontSize | CGFloat | Küçük yardımcı label metinlerinde ve ışık denetimi uyarılarında kullanılacak font boyutunu belirtir. Varsayılan değer: 14. |
| timerFontSize | CGFloat | Sayaç metinlerinde kullanılacak font boyutunu belirtir. Varsayılan değer: 32. |
| promptFontSize | CGFloat | Görüntülü beyan adımında okunacak metnin font boyutunu belirtir. Varsayılan değer: 16. |
| titleFontWeight | Int | Başlık metinlerinde kullanılacak font kalınlığını belirtir. Desteklenen değerler: 100, 400, 500, 700, 900. Varsayılan değer: 700. |
| bodyFontWeight | Int | Gö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. |
| promptFontWeight | Int | Gö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
| Parametre | Tip | Açıklama |
|---|---|---|
| isEnabled | Bool | Sesli okumanın etkin olup olmadığını belirtir. Varsayılan: true. |
| language | String | voiceIdentifier bulunamadığında varsayılan sesin seçileceği BCP-47 dil kodu. Örnek: "tr-TR", "en-US", "ru-RU". Varsayılan: "tr-TR". |
| voiceIdentifier | String? | 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. |
| speechRate | Float | Konuşma hızı. Aralık: 0.0 – 1.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. |
| volume | Float | Ses seviyesi. Aralık: 0.0 (sessiz) – 1.0 (tam). Varsayılan: 1.0. |
| pitchMultiplier | Float | Ses 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. |
| preUtteranceDelay | TimeInterval | Konuşma başlamadan önce eklenen sessizlik (saniye). Varsayılan: 0.0. |
| postUtteranceDelay | TimeInterval | Konuş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ırma | Ne 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. |
| Case | Açıklama |
|---|---|
.enabled(message: String?) | Uyarıyı açar. message verilmezse SDK'nın kendi lokalize metni gösterilir. |
.disabled | Uyarı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.
| Parametre | Tip | Açıklama |
|---|---|---|
| titleText | String? | Başarı ekranındaki ana başlık. |
| descriptionText | String? | Görselin altında gösterilen açıklama metni. |
| buttonText | String? | 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
| Parametre | Tip | Açıklama |
|---|---|---|
| language | String | SDK'nın kendi metinlerinin dili. Desteklenen değerler: "tr", "en", "ru". Varsayılan: "tr". |
| uiConfig | UIConfig? | SDK genelindeki renk, tipografi, şekil ve metin ayarlarını özelleştirir. |
| showCompletedScreen | Bool | Akış başarıyla tamamlandığında başarı ekranının gösterilip gösterilmeyeceğini belirler. Varsayılan: false. |
| completedScreenTexts | CompletedScreenTexts? | Başarı ekranındaki başlık, açıklama ve buton metinlerini özelleştirir. |
| livenessConfig | LivenessConfig? | Canlılık adımındaki talimatları ve görsel stili özelleştirir. |
| ttsConfig | TTSConfig? | Sesli okuma (text-to-speech) davranışını özelleştirir. |
| videoCallSplashScreenAssetName | String? | Video görüşme ekranı açıldığında gösterilen tam ekran görselin asset adı. |
| videoCallExternalLogoImage | UIImage? | Video görüşme ekranında gösterilen logo. |
| closeIconAssetName | String? | Info ekranlarındaki kapatma butonunun asset adı. |
| overexposureWarningConfig | WarningConfig | Aşırı aydınlık / ışık yansıması uyarısının yapılandırması. Varsayılan: .disabled. |
| lowLightWarningConfig | WarningConfig | Canlılık adımında düşük ışık uyarısının yapılandırması. Varsayılan: .disabled. |
| securityCheckEnabled | Bool | Jailbreak / 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.
| Metot | Karşı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:
| Durum | Olay | Ek davranış |
|---|---|---|
| Cihaz temiz | LogState.securityCheckPassed (SECURITY_CHECK_PASSED) | Akış normal şekilde devam eder. |
| Cihaz kompromize | LogState.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()
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.
| Dil | Kod |
|---|---|
| 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:
InfoPresentationModelBuilderile verilen başlık, açıklama, madde ve buton metinleriStepBuilder.setTitle()ile verilen adım başlıklarıStepBuilderüzerindeki glare / parlaklık uyarı metinleriNFCTextConfigile override edilen NFC metinleriLivenessConfigile override edilen canlılık metinleriCompletedScreenTextsile 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ı
| Case | Raw value |
|---|---|
idCardFrontStepOpened | ID_CARD_FRONT_STEP_OPENED |
idCardBackStepOpened | ID_CARD_BACK_STEP_OPENED |
idCardHologramStepOpened | ID_CARD_HOLOGRAM_STEP_OPENED |
idCardNfcStepOpened | ID_CARD_NFC_STEP_OPENED |
idCardLivenessStepOpened | ID_CARD_LIVENESS_STEP_OPENED |
passportStepOpened | PASSPORT_STEP_OPENED |
ruPassportAddressValidationStepOpened | RU_PASSPORT_ADDRESS_VALIDATION_STEP_OPENED |
videoCallStepOpened | VIDEO_CALL_STEP_OPENED |
videoRecordStepOpened | VIDEO_RECORD_STEP_OPENED |
selfieStepOpened | SELFIE_STEP_OPENED |
kpsStepOpened | KPS_STEP_OPENED |
stepSkipped | STEP_SKIPPED |
Akış Durumu Olayları
| Case | Raw value |
|---|---|
kycCompleted | KYC_COMPLETED |
kycFailed | KYC_FAILED |
kycCancelled | KYC_CANCELLED |
kycClosed | KYC_CLOSED |
kycRetry | KYC_RETRY |
kycMaxRetryReached | KYC_MAX_RETRY_REACHED |
kycCloseButtonClicked | KYC_CLOSE_BUTTON_CLICKED |
kycNfcCloseButtonClicked | KYC_NFC_CLOSE_BUTTON_CLICKED |
kycVideoCallClosed | KYC_VIDEO_CALL_CLOSED |
İzin ve Güvenlik Olayları
| Case | Raw value |
|---|---|
cameraPermissionGranted | CAMERA_PERMISSION_GRANTED |
microphonePermissionGranted | MICROPHONE_PERMISSION_GRANTED |
securityCheckPassed | SECURITY_CHECK_PASSED |
securityWarning | SECURITY_WARNING |
Belge Algılama Olayları
| Case | Raw value |
|---|---|
scanningDetectionTooDark | SCANNING_DETECTION_TOO_DARK |
scanningDetectionTooBright | SCANNING_DETECTION_TOO_BRIGHT |
scanningDetectionGlareDetected | SCANNING_DETECTION_GLARE_DETECTED |
scanningDetectionGlareNotDetected | SCANNING_DETECTION_GLARE_NOT_DETECTED |
scanningDetectionMultipleDocumentsDetected | SCANNING_DETECTION_MULTIPLE_DOCUMENTS_DETECTED |
scanningDetectionUnknownError | SCANNING_DETECTION_UNKNOWN_ERROR |
Diğer Olaylar
| Case | Raw value |
|---|---|
hologramVideoIsSaved | HOLOGRAM_VIDEO_IS_SAVED |
hologramRetry | HOLOGRAM_RETRY |
nfcMrzContent | NFC_MRZ_CONTENT |
mrzDataNotFound | MRZ_DATA_NOT_FOUND |
processNfcIntentHasFailed | PROCESS_NFC_INTENT_HAS_FAILED |
joinVideoCallQue | JOIN_QUEUE |
videoCallStartFailed | VIDEO_CALL_START_FAILED |
imageCompressFailed | IMAGE_COMPRESS_FAILED |
imageNotFound | IMAGE_NOT_FOUND |
convertDateFailed | CONVERT_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:
| Case | Açıklama |
|---|---|
.successful | Tü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
| Case | Açıklama |
|---|---|
.userRequested | Kullanıcı akış içindeki kapatma/iptal butonuna bastı. |
.programmatic | Entegratör dismissKYC() çağırarak akışı kapattı. |
.serverCancelled | Sunucu 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
)
| Parametre | Tip | Açıklama |
|---|---|---|
| from | UIViewController | Akışın başlatılacağı ekran. |
| clientToken | String | Kimlik doğrulama için üretilen benzersiz token. |
| applicationId | String | Kimlik doğrulama için üretilen uygulama ID'si. |
| stepList | [Step] | Adım yapılandırmalarının listesi. |
| configuration | KYCManagerConfig? | SDK yapılandırması. Opsiyoneldir. |
| initializeUrl | String | API base URL. Örnek: "https://your.domain.com/api/v1". |
| videoCallUrl | String | Video görüşme servislerinin base URL'i. |
| roomName | String? | Video görüşme isteklerinde randevu tanımlayıcısı olarak kullanılan oda adı. Varsayılan: nil. |
| useLocation | Bool | Konum bilgisinin kaydedilip kaydedilmeyeceği. Varsayılan: false. true verildiğinde Info.plist içindeki konum anahtarlarının tanımlı olması gerekir. |
Önemli:
fromparametresine birUINavigationControllerveyanavigationController'ı olan birUIViewControllerverilmelidir.
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"))
| Parametre | Tip | Açıklama |
|---|---|---|
| from | URL? | Sertifikanın indirileceği URL. |
| orEmbeddedFile | String? | Uygulama bundle'ına gömülü sertifika dosyasının adı. |
| isPEM | Bool | Sertifikanı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:
| Alan | Tip | Açıklama |
|---|---|---|
title | String | Hatanın lokalize başlığı. |
message | String | Hatanın lokalize mesajı. KYCManagerConfigBuilder ile override edildiyse override edilen değer döner. |
extraDetail | String? | 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)
| Case | Açıklama |
|---|---|
CAMERA_PERMISSION_DENIED | Kamera izni reddedildi. |
CAMERA_PERMISSION_PERMANENTLY_DENIED | Kamera izni kalıcı olarak reddedildi. |
CAMERA_NOT_FOUND | Cihazda kamera bulunamadı. |
CAMERA_CONFIGURATION_FAILED | Kamera yapılandırılamadı veya ön izleme oluşturulamadı. |
CAPTURE_PHOTO_FAILED | Fotoğraf çekilirken hata oluştu. |
VIDEO_RECORDING_FAILED | Video kaydedilirken hata oluştu. |
VIDEO_DELETE_FAILED | Geçici video silinemedi. |
FLASH_TOGGLE_FAILED | Flaş açma/kapama işlemi başarısız oldu. |
FACE_DETECTION_FAILED | Yüz algılama başarısız oldu. |
APP_WENT_BACKGROUND | Uygulama arka plana alındığı için işlem kesildi. |
UNKNOWN | Bilinmeyen kamera hatası. |
NFC Hataları (TeydexError.NFCError)
| Case | Açıklama |
|---|---|
DEVICE_NOT_HAVE_NFC | Cihazda NFC modülü bulunmuyor. |
NFC_NOT_ENABLED | NFC kapalı. |
NFC_READ_FAILED | Kimlik bilgisi okunamadı. |
TAG_LOST | Okuma sırasında kimlik ile bağlantı koptu. |
TAG_NOT_SUPPORTED | Kimlik kartı desteklenmiyor. |
ISO_DEP_NOT_SUPPORTED | NFC çipi ISO-DEP protokolünü desteklemiyor. |
CANT_CONNECT_NFC_TAG | NFC etiketine bağlanılamadı. |
MORE_THAN_ONE_TAG_FOUND | Birden fazla NFC etiketi algılandı. |
WRONG_MRZ_STRING | MRZ bilgisi doğrulanamadı. |
CARD_AUTH_FAILED | Kart kimlik doğrulaması başarısız oldu. |
PASSIVE_AUTH_FAILED | Pasif kimlik doğrulama başarısız oldu. |
ID_CARD_CAN_NOT_IDENTIFY | Kimlik kartı tanımlanamadı. |
PHOTO_NOT_FOUND | Çipten fotoğraf verisi alınamadı. |
USER_CANCELED | Kullanıcı okuma işlemini iptal etti. |
UNKNOWN | Bilinmeyen NFC hatası. |
Video Görüşme Hataları (TeydexError.VideoCallError)
| Case | Açıklama |
|---|---|
CLOSED | Kullanıcı görüşmeyi kapattı. |
FAIL | Video görüşme başarısız sonuçlandı. |
Görüntülü Beyan Hataları (TeydexError.VideoRecordError)
| Case | Açıklama |
|---|---|
TIME_OUT | Kayıt için tanımlanan süre doldu. |
RECORDING_FAILED | Video kaydı tamamlanamadı. |
NO_DATA | Kayıt sonunda video verisi elde edilemedi. |
Belge Algılama Hataları (TeydexError.DocumentAutoDetectError)
| Case | Açıklama |
|---|---|
MULTIPLE_DOCUMENTS_DETECTED | Kamerada birden fazla belge algılandı. |
GLARE_DETECTED | Belge üzerinde ışık yansıması algılandı. |
GLARE_NOT_DETECTED | Hologram adımında beklenen yansıma algılanamadı. |
TOO_BRIGHT | Ortam çok aydınlık. |
TOO_DARK | Ortam çok karanlık. |
UNKNOWN | Bilinmeyen belge algılama hatası. |
Timeout Hataları (TeydexError.TimeOutError)
| Case | Açıklama |
|---|---|
TIME_OUT | İşlem zaman aşımına uğradı. |
Sunucu Hataları (TeydexError.ServerError)
| Case | Açıklama |
|---|---|
UNKNOWN | Sunucu ile iletişimde bilinmeyen hata. |
UNEXPECTED | Beklenmeyen sunucu hatası. |
Red Hataları (TeydexError.RejectedError)
| Case | Açıklama |
|---|---|
REJECTED | İşlem reddedildi. |
MAX_RETRY_COUNT_EXCEEDED | Maksimum deneme sayısı aşıldı. |
Kimlik Okuma Hataları (TeydexError.IdentityReadFailedError)
| Case | Açıklama |
|---|---|
IDENTITY_READ_FAILED | Kimlik okunamadı. |
İzin Hataları (TeydexError.PermissionError)
| Case | Açıklama |
|---|---|
RECORD_PERMISSION_DENIED(errorMessage: String) | Mikrofon / kayıt izni reddedildi. |
LOCATION_PERMISSION_DENIED | Konum izni reddedildi. |
Güvenlik Hataları (TeydexError.SecurityError)
| Case | Açıklama |
|---|---|
DEVICE_COMPROMISED | Cihazda jailbreak, hooking veya benzeri bir güvenlik ihlali tespit edildi. |
Ağ Hataları (TeydexError.NetworkError)
| Case | Açı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. |
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.