Ana içeriğe geç

iOS - Utility Modülü

Utility Modülü, kimlik doğrulama akışlarını destekleyen yardımcı servisleri sunar. Randevu yönetimi, doküman imzalama, adres doğrulama ve kurumsal müşteri doğrulama (KYB) işlemleri bu modül üzerinden gerçekleştirilir.

Giriş

Utility Modülü, EnQualify SDK'in kimlik doğrulama ve müşteri edinimi esnasında yardımcı özelliklerine erişebilmek için oluşturulmuş bir modüldür. Bu modül içerisinde randevu sistemi, adres doğrulama sistemi, çağrı tiplerinin alınması, doküman imzalama ve doküman ekleme sistemi ile birlikte kurumsal müşterinin tanınması sürecinde kullanılan metodları içermektedir.

Utility Modülünün Projeye Eklenmesi

EnQualify SDK Utility Modül'ün kullanımı tıp diğer modüllerde olduğu gibi "Podfile" içerisine ilgili modül ve sürüm numarası eklenerek gerçekleştirilebilir.

Text Only
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
source 'https://github.com/CocoaPods/Specs.git'
source 'ssh://git@github.com/EnquraTechnology/EnQualifyiOSPackages.git'

target 'EnQualifyPlus-SDK' do
  # Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
  pod 'EnQualify/OCR', '2.0.4.2'
  pod 'EnQualify/Face', '2.0.4.2'
  pod 'EnQualify/NFC', '2.0.4.2'
  pod 'EnQualify/VideoCall', '2.0.4.2'
  pod 'EnQualify/Utility', '2.0.4.2'
  # Pods for EnQualifyPlus-SDK
end

Utility Modüle diğer yardımcı modüllerde olduğu gibi Enqualify/Core modül'e ihtiyaç duyar bunun dışında herhangi bir bağımlılık içermeden doğrudan kullanılabilir.

Utility Modülü Nasıl Implemente Edilir ?

Utility Modüle, EnQualify SDK'in diğer modüllerine nazaran en büyük farklılık delegate observation yapısı ile değil, @escaping closure yapısı ile çalışmaktadır. Bununla birlikte ilgili class'ın kendisine ait observe / trigger edeceği method bulunmadığından dolayı yalnızca CoreModüle üzerinden gelen yanıtları iletmek üzere delegate yapısı mevcuttur.

Text Only
import UtilityModule


class ViewController: UIViewController, EnQualifyUtilityDelegate {

    func someMethodInside() {
        EnQualifyUtility.setBaseModel(with baseModel: BaseModelUtility, delegate: Any?)
    }

    func baseModelCompleted() { }
    func initializeFailed(with key: CustomNSError) { }
    func deinitializeCompleted(moduleName: String) { }
}

EnQualifyUtility.setBaseModel fonksiyonu ilgili modül'ü kullanırken verification platform üzerindeki bilgilere erişebilmek için gerekli olan adresi, authorization ve configurasyonların belirlendiği ve CoreModül'e bildirildiği yerdir. Bu fonksiyonun çağırımının başarılı olması durumunda baseModelCompleted() tetiklenmektedir, aksi bir durum gerçekleşmesi durumunda initializeFailed(with key: CustomNSError) tetiklenmekte ve içerisindeki CustomNSError içerisindeki cevap değerlendirilebilir.

Text Only
// BaseModelUtility
    public var signallingCertificateList: [String]?
    public var mapiCertificateList: [String]?
    public var signallingCertificateBase64List: [String]?
    public var mapiCertificateBase64List: [String]?
    public var baseURL: String?
    public var locale: String?
    public var mobileUser: String?
    public var countryCode: String?

Burada istenilen BaseModelUtility EnQualify SDK'in yardımcı modüllerinde verilmesi gereken CoreBaseModel ile aynıdır.

Çağrı Tiplerinin Alınması

Çağrı tipleri fonksiyonu, doğrulama ve kimlik kontrol süreçlerinde hangi tür çağrı yöntemlerinin mevcut olduğunu belirlemek için kullanılır. Bu bilgi, kullanıcıya sunulacak doğrulama seçeneklerini dinamik olarak belirlemeye yardımcı olur. Bu çağrı tiplerine özel olarak belirlemiş olduğunuz ayarları alabilmeniz için ilgili alanlarda kullanmanıza olanak sağlar.

Fonksiyon

Çağrı Tipi Getirme - callTypeGet

Sistemde mevcut olan tüm çağrı tiplerini getirir.

Sözdizimi

Text Only
public static func callTypeGet(
    with handler: String?, 
    completionHandler: @escaping ([String: String]?) -> ()
)

Parametreler

Parametre Tip Açıklama
handler String? İstek için opsiyonel tanımlayıcı veya bağlam bilgisi
completionHandler ([String: String]?) -> () Çağrı tiplerini döndüren completion bloğu

Default KYC çağrı tipleri gelirken, istenirse KYB çağrı tipleri getirilebilmesi için handler "KYB" olarak verilmelidir.

Dönüş Değeri

  • [String: String]?: Çağrı tiplerini içeren dictionary

  • Key: Çağrı tipi kodu/kimliği

  • Value: Çağrı tipi açıklaması/adı

Kullanım Örneği

Text Only
EnQualifyCore.callTypeGet(with: "CONTEXT_ID_123") { callTypes in
    guard let callTypes = callTypes else {
        print("Çağrı tipleri alınamadı")
        return
    }

    print("Mevcut çağrı tipleri:")
    for (key, value) in callTypes {
        print("Kod: \(key) - Açıklama: \(value)")
    }
}

Handler Parametresi Kullanımı

handler parametresi, isteğe özel bağlam bilgisi sağlamak için kullanılabilir:

Text Only
// Belirli bir işlem için çağrı tipleri
EnQualifyUtility.callTypeGet(with: "KYB") { callTypes in
}

// Genel kullanım için çağrı tipleri
EnQualifyUtility.callTypeGet(with: nil) { callTypes in
}

Randevu Sistemi

Randevu Nedir?

EnQualify SDK mevzuata uygun iki aşamalı (parçalı) doğrulama sistemine sahiptir. Bu aşamalardan ilki olan Self-Service akış tamamlandıktan sonra eğer zorunlu ise Video Görüşme için devam edilmelidir. Sisteminizde bulunan agentların yoğunluğu ya da diğer farklı sebeplerden ötürü, aday müşteri görüntülü görüşmeye o an katılamaz ise randevu oluşturarak görüntülü görüşmenin zamanını belirleyebilirsiniz. Bu randevu yönetim sistemi ile birlikte mevcut randevuların kontrolü, mevcut randevunun iptali, yeni alınacak randevuların tarihi ve saatinin alınması ve yeni randevu oluşturmak mümkündür.

Randevu Sistemine Erişim

EnQualifySDK modüler yapısı gereği, randevu sistemine her modül üzerinden erişilebilir bir yapıda tasarlanmıştır. EnQualifyOCR, EnQualifyNFC, EnQualifyFace ve EnQualifyVideoCall üzerinden randevu sisteminin bütün yeteneklerine ulaşmak mümkündür.

Mevcut Randevu Kontrolü

Kullanıcı akışa başlamadan önce kendisine ait daha önce oluşturulmuş bir randevu var ise bunu appointmentGet metodu ile kontrolü mümkündür.

Text Only
import UtilityModule

/// Identity Type: "T.C. Kimlik Kartı"
/// Identity No: "12345678901"
 EnQualifyUtility.appointmentGet(identityType: String?, identityNo: String?) { result in
 }

bu çağırım sonrası size dönecek olan sonucu capture ettiğinizde [[String : AnyObject]] tipinde bir veriye erişeceksiniz. Bu veri tipi içerisinde key value ikililerinden oluşan bir yapı karşınıza çıkacak. Dönen veriyi incelemek gerekirse:

Text Only
uId: UUID?                   // Randevunuza ait unique bir referans
callType: String?            // Randevunun hangi callType'a ait olduğu
callTypeValue: String?       // Ait olan callType'ın verification platformdaki UI ismi
identityType: String?        // Randevunun hangi kimlik tipinde olduğu
identityNo: String?          // Randevunun hangi kimlik numarasına ait olduğu
name: String?                // Randevu alan kişinin ismi
surname: String?             // Randevu alan kişinin soyismi
phone: String?               // Randevu alan kişinin telefon numarası
email: String?               // Randevu alan kişinin e-posta adresi
startDate: String?           // Randevunun hangi güne ait olduğu
endDate: String?             // Randevuya katılmak için son tarih
isPriorityCustomer: Bool?    // Randevunun önceliğini belirtir.

Mevcut Randevunun İptali

Kullanıcı isterse daha önceden oluşturmuş olduğu randevuyu iptal edebilir. Önceden oluşturulan randevunun iptali için EnQualifySDK 'in sunduğu appointmentCancel API'si kullanılır.

Text Only
import UtilityModule
/// callType : "NewCustomer"
/// identityType: "T.C. Kimlik Kartı"
/// identityNo: "12345678901"
EnQualifyUtility.appointmentCancel(callType: String, identityType: String, identityNo: String ) { result in 

}

bu çağırım sonucu size iptal etmek istediğiniz randevunun iptal sonucu ile ilgili Bool bir değer dönmektedir.

Uygun Randevuların Kontrolü

Kullanıcı, gerekli olduğu durumda randevu oluşturabilmek ve kendisine uygun randevu zamanını belirleyebilmek için daha önceden verification platform üzerinden tanımlanan slotlar ile birlikte randevu tarih ve zamanına erişebilir. Bu kontrole ulaşabilmek için EnQualifySDK'in sunduğu appointmentAvailableGet API'si kullanılır.

Text Only
import UtilityModule
/// callType: "NewCustomer"
/// startDate: "2025-01-23T04:56:07.000+00:00"
/// endDate: "2025-01-23T04:56:07.000+00:00"
EnQualifyUtility.appointmentAvailableGet(callType: String?, startDate: String?, endDate: String?) { result in 
}

bu çağırım sonrası size dönecek olan sonucu capture ettiğinizde [[String : AnyObject]] tipinde bir veriye erişeceksiniz. Bu veri tipi içerisinde key value ikililerinden oluşan bir yapı karşınıza çıkacak. Dönen veriyi incelemek gerekirse:

Text Only
date: String?            // Randevunun hangi gün'e ait olduğu
startTime: String?       // Randevunun başlangıç saati
endTime: String?         // Randevunun bitiş saati
count: String?           // Saat aralığındaki randevu sayısı

Randevu oluşturma

Kullanıcı kendisine uygun tarih ve saati belirleyerek randevu oluşturabilir. Bu işlemi gerçekleştirebilmek için EnQualifySDK'in sunduğu appointmentSave API'si kullanılır.

Text Only
import UtilityModule
/// callType: "NewCustomer"
/// date: "2025-05-09T00:00:00Z"
/// startTime: "14:45:00"
/// identityType: "T.C. Kimlik Kartı"
/// identityNo: "12345678901"
/// name: "Ahmet"
/// surname: "Yılmaz"
/// phone: "05993311920"
/// email: "example@enqura.com"
/// uId: "c18683b4-8c79-47ef-bd93-60f54c64e8de"
EnQualifyUtility.appointmentSave(callType: String?, date: String?, startTime: String?, identityType: String?, identityNo: String?, name: String?, surname: String?, phone: String?, email: String?, uId: UUID?) { result in 
}

bu çağırım sonucu, belirtilen tarih ve saat için randevu oluşturulmasına dair sonuç Bool tipinde döner.

Doküman İmzalama

5.2.7. Döküman İmzalama

Mobilden Güvenli Doküman İmzalama

Mobil cihazlar üzerinden yapılan doküman imzalama işlemimiz, hem kullanıcının onayını hem de imzalanan içeriğin bütünlüğünü garanti altına alan güvenli bir yapıya sahiptir. Kullanıcı bir dokümanı imzalamak istediğinde, mobil cihazına özel bir anahtar gönderilir. Bu anahtar sayesinde, dokümanın belirli bir özeti alınır ve sadece o kullanıcıya özgü bir imza oluşturulur.

Bu imza, daha sonra sistemimize kaydedilerek, imzalanan dokümanın daha sonra değiştirilmediği ve gerçekten o kullanıcı tarafından onaylandığı her zaman kanıtlanabilir hale getirilir.

Text Only
EnQualifyUtility.signingSet(data: Data, reference: String? = nil) { (status: Bool) in 
}

Döküman başarılı bir şekilde imzalandığında, status parametresi true değer dönecektir. Bu closure içerisinde, başka bir döküman imzalama işlemi yapılmayacaksa EnQualifyUtility.signingFinish() fonksiyonu çağrılabilir.

Döküman imzalama işlemi başarısız olduğunda status parametresi false değer dönecektir. Bu değer ile birlikte iş akışına göre değerlendirilip diğer işlemlere geçilebilir ya da kullanıcıya hata mesajı gösterebilirsiniz.

Döküman imzalama işlemi tamamlandığında EnQualifyUtility.signingFinish() fonksiyonu çağırımının içerisindeki capture edilen status Bool değeri dönecektir, true sonuç imzalama işleminin bitimindeki CustomerAPI'nin tetiklenmesi için sürecin bittiğini işaret eder. False sonuç ise bu esnada yaşanan bir hatadan kaynaklanan sorundan dolayı işlemin bittiğini verification platforma doğru bir biçimde ulaştıramadığını anlatmaktadır.

Text Only
EnQualifyUtility.signingFinish(reference: String? = nil)

Adres Doğrulama

Adres doğrulama sistemi, kullanıcıların kimlik belgelerinde yer alan kimlik bilgilerinin, barkodlu adres doğrulama belgesinde bulunan bilgiler ile eşleşip eşleşmediğini kontrol etmek için kullanılır. Bu süreç iki ana fonksiyon ile gerçekleştirilir:

  1. Barkod Okuma (barcodeRead)
  2. Adres Doğrulama (addressVerify)

Fonksiyonlar

1. Barkod Okuma - barcodeRead

Bu fonksiyon, ikametgah belgesindeki barkoddan bilgileri okumak ve parse etmek için kullanılır.

Text Only
public static func barcodeRead(
    content: String?, 
    isWithAddress: AnyObject?, 
    identityNo: String?, 
    completionHandler: @escaping (String?, String?, String?, Bool?) -> ()
)

Parametreler

Parametre Tip Açıklama
content String? Barkoddan okunan ham veri içeriği
isWithAddress AnyObject? Adres bilgisinin dahil edilip edilmeyeceğini belirten opsiyonel parametre
identityNo String? T.C. Kimlik numarası
completionHandler (String?, String?, String?, Bool?) -> () İşlem tamamlandığında çağrılacak completion bloğu

Completion Handler Dönüş Değerleri

Completion handler aşağıdaki parametreleri döndürür:

  • barcode (String?): İşlenmiş barkod verisi
  • expireDate (String?): Belgenin son kullanma tarihi
  • address (String?): Belgede yer alan adres bilgisi
  • isSameIdentity (Bool?): Kimlik numarasının eşleşip eşleşmediği

Kullanım Örneği

Text Only
import UtilityModule

EnQualifyUtilty.barcodeRead(
    content: "base64DataSample",
    isWithAddress: true,
    identityNo: "12345678901",
    completionHandler: { barcode, expireDate, address, isSameIdentity in
        guard let barcode = barcode,
              let address = address,
              let isSameIdentity = isSameIdentity,
              isSameIdentity else {
            print("Barkod okuma başarısız")
            return
        }

        print("Barkod: \(barcode)")
        print("Son Kullanma Tarihi: \(expireDate ?? "Belirtilmemiş")")
        print("Adres: \(address)")
    }
)

2. Adres Doğrulama - addressVerify

Bu fonksiyon, ikametgah belgesindeki adres bilgisi ile birlikte nüfus vatandaşlık işleri sistemine bağlanarak ilgili belgede bulunan bilgilerin doğruluğunu teyit etmek için kullanılır.

Text Only
public static func addressVerify(
    identityNo: String, 
    barcode: String, 
    completionHandler: @escaping (Bool) -> ()
)

Parametreler

Parametre Tip Açıklama
identityNo String T.C. Kimlik numarası
barcode String Doğrulanacak barkod verisi
completionHandler (Bool) -> () İşlem tamamlandığında çağrılacak completion bloğu

Completion Handler Dönüş Değeri

  • Bool: Adres doğrulama başarılı ise true, başarısız ise false
Text Only
import UtilityModule

EnQualifyUtilty.addressVerify(
    identityNo: "12345678901",
    barcode: "barcode_string",
    completionHandler: { isVerified in
        if isVerified {
            print("Adres doğrulama başarılı")
            // Doğrulama başarılı işlemleri
        } else {
            print("Adres doğrulama başarısız")
            // Hata durumu işlemleri
        }
    }
)

Kurumsal Müşteri Süreçleri (KYB - Know Your Business)

Genel Bakış

İşletme doğrulama sistemi, kimlik doğrulama işlemlerinden önce kurumsal müşterilerin sisteme tanıtılması için kullanılır. Bu süreç, işletme bilgilerinin kaydedilmesi, çalışan yönetimi ve gerekli dokümanların toplanması aşamalarından oluşur.

Temel İş Akışı

  1. İşletme Kontrolü (callBusinessCheck) - Daha önce kayıt var mı kontrol edilir
  2. İşletme Ekleme (callBusinessAdd) - Yeni işletme sisteme eklenir
  3. Çalışan Yönetimi (callBusinessStaffAdd/Check) - İşletme çalışanları eklenir var ise kontrol edilir.
  4. Doküman Yönetimi (callBusinessDocumentAdd) - Gerekli belgeler yüklenir
  5. Güncelleme (callBusinessUpdate) - İşlem durumu güncellenir

Fonksiyonlar

1. İşletme Kontrolü - callBusinessCheck

Verilen vergi numarası ile daha önceden kayıtlı bir işletme olup olmadığını kontrol eder.

Text Only
public static func callBusinessCheck(
    taxNumber: String,
    reference: String? = nil,
    completionHandler: @escaping (VerifyCallBusinessCheckModelWrapper?) -> ()
)

Parametreler

Parametre Tip Açıklama
taxNumber String İşletme vergi numarası
reference String? İşlem referans bilgisi (opsiyonel)
completionHandler (VerifyCallBusinessCheckModelWrapper?) -> () İşlem tamamlandığında çağrılacak completion bloğu

Dönüş Modeli - VerifyCallBusinessCheckModelWrapper

Text Only
public var checkRecord: AnyObject?      // Daha önceden kayıt var mı?
public var callBusinessUId: String?     // Bu işleme ait business ID
public var type: String?               // İşletme tipi (limited/şahıs)

Kullanım Örneği

Text Only
import UtilityModule

EnQualifyUtility.callBusinessCheck(
    taxNumber: "1234567890",
    reference: "REF123",
    completionHandler: { result in
        guard let result = result else {
            print("İşletme kontrolü başarısız")
            return
        }

        if result.checkRecord != nil {
            print("İşletme daha önce kaydedilmiş")
            print("Business ID: \(result.callBusinessUId ?? "Belirtilmemiş")")
            print("Tip: \(result.type ?? "Belirtilmemiş")")
        } else {
            print("Yeni işletme kaydı gerekiyor")
        }
    }
)

2. İşletme Ekleme - callBusinessAdd

Yeni bir işletmeyi sisteme ekler.

Text Only
public static func callBusinessAdd(
    taxNumber: String,
    name: String,
    shortName: String? = nil,
    data: String? = nil,
    type: String? = nil,
    reference: String? = nil,
    completionHandler: @escaping (String?) -> ()
)

Parametreler

Parametre Tip Açıklama
taxNumber String İşletme vergi numarası
name String İşletme tam adı
shortName String? İşletme kısa adı (opsiyonel)
data String? Verification platform'da dashboard görünümü için ek bilgiler
type String? İşletme tipi ("limited" veya "şahıs")
reference String? İşlem referans bilgisi
completionHandler (String?) -> () İşlem sonucunda dönen business ID

Kullanım Örneği

Text Only
import UtilityModule

EnQualifyUtility.callBusinessAdd(
    taxNumber: "1234567890",
    name: "Örnek Şirket A.Ş.",
    shortName: "Örnek Şirket",
    data: "Dashboard için ek bilgiler", // JSON şeklinde gönderilecektir.
    type: "limited",
    reference: "REF123",
    completionHandler: { businessId in
        if let businessId = businessId {
            print("İşletme başarıyla eklendi. Business ID: \(businessId)")
        } else {
            print("İşletme ekleme başarısız")
        }
    }
)

3. Çalışan Ekleme - callBusinessStaffAdd

İşletmeye yeni çalışan ekler.

Text Only
public static func callBusinessStaffAdd(
    callBusinessUID: String?,
    sessionUId: String?,
    name: String,
    surname: String,
    identityNo: String,
    birthDate: String,
    phone: String,
    completionHandler: @escaping (AnyObject?) -> ()
)

Parametreler

Parametre Tip Açıklama
callBusinessUID String? İşletme benzersiz kimliği
sessionUId String? Oturum kimliği
name String Çalışan adı
surname String Çalışan soyadı
identityNo String T.C. Kimlik numarası
birthDate String Doğum tarihi
phone String Telefon numarası
completionHandler (AnyObject?) -> () İşlem sonucu

Kullanım Örneği

Text Only
import UtilityModule

EnQualifyUtility.callBusinessStaffAdd(
    callBusinessUID: "BUSINESS_123",
    sessionUId: "SESSION_456",
    name: "Ahmet",
    surname: "Yılmaz",
    identityNo: "12345678901",
    birthDate: "1990-01-15",
    phone: "+905551234567",
    completionHandler: { result in
        if result != nil {
            print("Çalışan başarıyla eklendi")
        } else {
            print("Çalışan ekleme başarısız")
        }
    }
)

4. Çalışan Kontrolü - callBusinessStaffCheck

İşletmeye ait bir çalışanın kayıtlı olup olmadığını kontrol eder.

Sözdizimi

Text Only
public static func callBusinessStaffCheck(
    identityNo: String,
    callBusinessUID: String?,
    completionHandler: @escaping (AnyObject?) -> ()
)

Parametreler

Parametre Tip Açıklama
identityNo String Kontrol edilecek çalışanın T.C. Kimlik numarası
callBusinessUID String? İşletme benzersiz kimliği
completionHandler (AnyObject?) -> () Kontrol sonucu (Bool değere cast edilmelidir.)

Kullanım Örneği

Text Only
import UtilityModule

EnQualifyUtility.callBusinessStaffCheck(
    identityNo: "12345678901",
    callBusinessUID: "BUSINESS_123",
    completionHandler: { result in
        if result != nil {
            print("Çalışan mevcut")
        } else {
            print("Çalışan bulunamadı")
        }
    }
)

5. İşletme Güncelleme - callBusinessUpdate

İşletme kaydının durumunu günceller.

Sözdizimi

Text Only
public static func callBusinessUpdate(
    callBusinessUID: String?,
    reference: String?,
    isInProgress: AnyObject?,
    type: String?,
    completionHandler: @escaping (AnyObject?) -> ()
)

Parametreler

Parametre Tip Açıklama
callBusinessUID String? İşletme benzersiz kimliği
reference String? İşlem referans bilgisi
isInProgress AnyObject? İşlemin devam edip etmediği (true/false)
type String? İşletme tipi
completionHandler (AnyObject?) -> () Güncelleme sonucu (Bool değere cast edilmelidir.)

Kullanım Örneği

Text Only
import UtilityModule

EnQualifyUtility.callBusinessUpdate(
    callBusinessUID: "BUSINESS_123",
    reference: "REF123",
    isInProgress: true,
    type: "limited",
    completionHandler: { result in
        if result != nil {
            print("İşletme durumu güncellendi")
        } else {
            print("Güncelleme başarısız")
        }
    }
)

6. Doküman Ekleme - callBusinessDocumentAdd

İşletmeye ait dokümanları sisteme yükler.

Text Only
public static func callBusinessDocumentAdd(
    category: String?,
    reference: String?,
    callBusinessUId: String?,
    document: [VerifyMobileCallBusinessDocumentArrayWrapper]?,
    completionHandler: @escaping (AnyObject?) -> ()
)

Parametreler

Parametre Tip Açıklama
category String? Doküman kategorisi
reference String? İşlem referans bilgisi
callBusinessUId String? İşletme benzersiz kimliği
document [VerifyMobileCallBusinessDocumentArrayWrapper]? Yüklenecek doküman array'i
completionHandler (AnyObject?) -> () Yükleme sonucu (Bool değere cast edilmelidir.)

Doküman Modeli - VerifyMobileCallBusinessDocumentArrayWrapper

Text Only
public var extension: String?      // Dosya uzantısı (pdf, jpg, png vb.)
public var content: String?        // Dosya içeriği (Base64 formatında)
public var contentHash: String?    // Dosya hash değeri

Kullanım Örneği

Text Only
import UtilityModule

let document = VerifyMobileCallBusinessDocumentArrayWrapper()
document.extension = "pdf"
document.content = "Base64EncodedFileContent"
document.contentHash = "SHA256HashValue"

EnQualifyUtility.callBusinessDocumentAdd(
    category: "TICARET_SICIL_GAZETESI",
    reference: "REF123",
    callBusinessUId: "BUSINESS_123",
    document: [document],
    completionHandler: { result in
        if result != nil {
            print("Doküman başarıyla yüklendi")
        } else {
            print("Doküman yükleme başarısız")
        }
    }
)

7. KYB Doküman Kategori Listesi - getDocumentKYBCategoryList

KYB akışında eklenecek olan dokümanların kategorilerini getirir.

Text Only
public static func getDocumentKYBCategoryList(
    completionHandler: @escaping ([VerifyInfoDocumentKYBCategoryArrayWrapper]?) -> ()
)

Dönüş Modeli - VerifyInfoDocumentKYBCategoryArrayWrapper

Text Only
public var category: String?       // Kategori kodu
public var name: String?          // Kategori adı (Türkçe)
public var nameEn: String?        // Kategori adı (İngilizce)
public var isRequired: AnyObject? // Zorunlu mu?
public var sequence: NSNumber?    // Sıralama
public var secondPhase: AnyObject? // İkinci fazda mı gerekli?

Kullanım Örneği

Text Only
import UtilityModule

EnQualifyUtility.getDocumentKYBCategoryList { categories in
    guard let categories = categories else {
        print("Kategori listesi alınamadı")
        return
    }

    for category in categories {
        print("Kategori: \(category.category ?? "Belirtilmemiş")")
        print("Ad: \(category.name ?? "Belirtilmemiş")")
        print("Zorunlu: \(category.isRequired ?? false)")
        print("---")
    }
}

Sesli Doğrulama

1. Ürün Tanımı

EnQualify Sesli Doğrulama SDK'sı, kimlik doğrulama süreçlerine ses ve video katmanı ekleyen bir mobil entegrasyon çözümüdür. Müşterileriniz ekrandaki soruları sesli yanıtlar; sistem bu yanıtları analiz ederek kimlik teyidini gerçekleştirir.

Ne İşe Yarar?

  • Müşteri temsilcisiz, tamamen dijital kimlik doğrulama
  • Sesli yanıt + video kaydı ile ikili doğrulama katmanı
  • Soru grupları (teyitli soru, onay metni, teyitsiz soru) üzerinden esnek senaryo kurgusu
  • Yanıtlar STT (konuşmayı metne çevirme) ile işlenir, backend tarafında eşleştirilir

2. Kullanıcı Akışı

Adım Ekran ve İşlem
1 — Hazırlık Bilgilendirme ekranı gösterilir. Mikrofon ve kamera izni istenir. Kullanıcı "Başlayın" butonuna basar; arka planda soru konfigürasyonu servisten çekilir.
2 — Sesli Yanıt Her soru için kullanıcı mikrofon butonuna basarak yanıtını kaydeder. Kayıt duraklatılabilir, geri dinlenebilir ve silinebilir. Gönder butonuna basıldığında ses ve video backend'e iletilir; STT sonucu anlık döner.
3 — Onay Tüm yanıtlar özet ekranında listelenir. Kullanıcı bir yanıtı yanlış bulduysa o soruyu tekrar kaydedebilir. Onaylıyorum butonuna basıldığında nihai doğrulama servisi çağrılır.

Başarılı — Özet ekranı gösterilir, akış bir sonraki adıma yönlendirilir.
Başarısız — Kullanıcı "Tekrar Dene" ile başa dönebilir.
⚠️ Teknik Hata — Kullanıcı görüntülü görüşmeye yönlendirilir.


3. Soru Konfigürasyonu

ContentType Açıklama
ConfirmedQuestion Kullanıcının kimlik bilgisini doğrulayan sorular (ör. Baba adı, Seri no). Yanıtlar backend'deki kayıtlı verilerle eşleştirilir.
ConfirmationText Kullanıcının sesli olarak onaylaması gereken metinler (ör. sözleşme maddeleri, ürün bilgileri).
UnconfirmedQuestion Serbest yanıt soruları. Yanıt eşleştirmesi yapılmaz, ses kaydı alınır.
  • ConfirmedQuestion grubunda 3 soru varsa → ⅓, ⅔, 3/3 şeklinde gösterilir
  • Ardından ConfirmationText grubuna geçilir, numaralandırma 1'den başlar
  • DisplayCount — gruptan kaç soru gösterileceği
  • IsRandom — soruların rastgele sıralanıp sıralanmayacağı

4. Teknik Entegrasyon

SDK üç servis üzerinden çalışır. Entegrasyon sırası aşağıdaki gibidir:

4.1 Gereksinimler

  • iOS 14+
  • Swift 5.7+
  • EnQualifyUtility framework (UtilityModule)
  • Info.plist: NSMicrophoneUsageDescription, NSCameraUsageDescription

4.2 Adım 1 — SDK'yı Başlat ve Soruları Çek

conversationalValidationLaunch ile oturum başlatılır. Başarılı bağlantı sonrası delegate callback'i tetiklenir, soru listesi bu callback üzerinden alınır.

swift

Text Only
EnQualifyUtility.conversationalValidationLaunch(
    baseModel: baseModel,
    sessionModel: sessionModel,
    delegate: self
)

// Delegate callback — sorular bu metod ile gelir
func conversationalValidationConfigGetCompleted(
    config: [VerifyVoiceVerificationMobileListWrapper]?
) {
    // config içinde sorular, içerik tipleri,
    // displayCount, isRandom ve expectedAnswers bulunur
}

SessionModelUtility parametreleri:

Parametre Açıklama
callType Çağrı tipi (ör. "NewCustomer")
name / surname Kullanıcı adı soyadı
identityNo TC kimlik numarası
reference Unique işlem referansı (UUID)

4.3 Adım 2 — Her Soru İçin Ses ve Video Gönder

Kullanıcı her soruyu yanıtladıktan sonra callVoiceVerificationAdd çağrılır. SDK ses ve video dosyalarını otomatik olarak işleyip backend'e iletir. STT sonucu answer alanında döner.

swift

Text Only
EnQualifyUtility.callVoiceVerificationAdd(
    videoContentURL: videoFileURL,       // Kameradan kaydedilen mp4
    soundContentURL: audioFileURL,       // Mikrofondan kaydedilen m4a
    voiceVerificationContentUId: contentUId  // Hangi soruya ait olduğu
) { response in
    let answer = response?.answer ?? ""
    // answer dolu   → STT başarılı, bir sonraki soruya geç
    // answer boş    → STT başarısız, kullanıcıya hata göster
    // response nil  → teknik hata
}

contentUId değeri soru konfigürasyonundan (VerifyVoiceVerificationMobileListWrapper.contentUId) gelir ve her soru için benzersizdir.

4.4 Adım 3 — Tüm Sorular Tamamlandığında Onay Al

Kullanıcı tüm yanıtları onayladıktan sonra callVoiceVerificationApproved çağrılır.

swift

Text Only
EnQualifyUtility.callVoiceVerificationApproved { isApproved in
    if isApproved {
        // Doğrulama başarılı → sonraki adıma geç
    } else {
        // Doğrulama başarısız → kullanıcıya hata göster
    }
}

4.5 Servis Akış Özeti

Text Only
conversationalValidationLaunch()
conversationalValidationConfigGetCompleted (delegate)
[ Her soru için ]
callVoiceVerificationAdd(video, ses, contentUId)
        ↓  response.answer
[ Tüm sorular bitti ]
callVoiceVerificationApproved()
        ↓  true / false

5. Güvenlik ve Veri Akışı

  • Ses dosyaları m4a formatında kaydedilir, SDK tarafından base64'e çevrilerek backend'e iletilir
  • Video dosyaları mp4 formatında, ses track'i olmadan kaydedilir
  • Her soru için ses ve video ayrı ayrı gönderilir (contentUId ile eşleştirilir)
  • STT işlemi backend tarafında gerçekleşir; mobil cihazda hiçbir metin analizi yapılmaz