Skip to content

Getting started

Boriss Melikjan edited this page Apr 6, 2026 · 2 revisions

Building source code with XCode or command line:

To easily get started with RIA-DigiDoc-iOS project, check out Building source code with XCode

Modules can also be imported manually.

Getting project modules

You can find the source code under releases. Just download "Source code (zip or tar.gz)", unpack it and you're ready to go!

Adding modules to your project

  1. Download latest version of the source code if you haven't done so yet, and unpack it.
  2. In XCode, choose File -> New -> Package...
  3. Choose the directory where the unpacked source code is
  4. Import modules as needed
  5. After importing, build project

Fetch and package default configuration

To fetch and package default configuration, run command:

swift-sh SetupConfiguration/Sources/main.swift

The default configuration setup is: Configuration downloaded from: https://id.eesti.ee/ Configuration update interval: 7 (days)

The build will be stopped if configuration validation fails.

Libdigidocpp setup

You're almost done. In order for library to work with containers, it needs to prepare a few things first. For that you need to call setup method. We recommend you to do this at earliest opportunity. Setup will take some time, so you need to make sure it finishes first before starting any container actions.

If you have imported LibdigidocLib, CryptoLib and ConfigLib modules, example setup libdigidocpp as follows:

import LibdigidocLibSwift
import CryptoObjCWrapper
import CryptoSwift
import ConfigLib
import CommonsLib
import UtilsLib

actor LibrarySetup: Loggable {
    private let configurationLoader: ConfigurationLoaderProtocol
    private let configurationRepository: ConfigurationRepositoryProtocol
    private let fileManager: FileManagerProtocol
    private let fileUtil: FileUtilProtocol
    private let tslUtil: TSLUtilProtocol
    private let dataStore: DataStoreProtocol
    private let advancedSettingsRepository: AdvancedSettingsRepositoryProtocol
    private let keychainStore: KeychainStoreProtocol
    private let proxyUtil: ProxyUtilProtocol
    private let cryptoSetup: CryptoSetupProtocol
    private let userAgentUtil: UserAgentUtilProtocol

    init(
        configurationLoader: ConfigurationLoaderProtocol,
        configurationRepository: ConfigurationRepositoryProtocol,
        fileManager: FileManagerProtocol,
        fileUtil: FileUtilProtocol,
        tslUtil: TSLUtilProtocol,
        dataStore: DataStoreProtocol,
        advancedSettingsRepository: AdvancedSettingsRepositoryProtocol,
        keychainStore: KeychainStoreProtocol,
        proxyUtil: ProxyUtilProtocol,
        cryptoSetup: CryptoSetupProtocol,
        userAgentUtil: UserAgentUtilProtocol
    ) {
        self.configurationLoader = configurationLoader
        self.configurationRepository = configurationRepository
        self.fileManager = fileManager
        self.fileUtil = fileUtil
        self.tslUtil = tslUtil
        self.dataStore = dataStore
        self.advancedSettingsRepository = advancedSettingsRepository
        self.keychainStore = keychainStore
        self.proxyUtil = proxyUtil
        self.cryptoSetup = cryptoSetup
        self.userAgentUtil = userAgentUtil
    }

    func setupLibraries() async {
        let isLoggingEnabled = await initializeLogging()

        do {
            let proxyInfo = await proxyUtil.getProxyInfo()
            let appLanguage = await dataStore.getSelectedLanguage()
            let userAgent = userAgentUtil.userAgent(diagnostics: .none, language: appLanguage)

            try DigiDocConf.observeConfigurationUpdates(
                configurationRepository: configurationRepository
            )

            if let schemaDirectory = Directories.getLibraryDirectory(fileManager: fileManager) {
                try tslUtil.setupTSLFiles(tsls: [], destinationDir: schemaDirectory)
            }

            let configDirectory = try Directories.getCacheDirectory(
                fileManager: fileManager
            ).appending(path:
                CommonsLib.Constants.Configuration.CacheConfigFolder
            )

            // Make sure "initDigiDoc" is still run even if configuration has an error
            do {
                try await configurationLoader.initConfiguration(
                    configDir: configDirectory,
                    proxyInfo: proxyInfo,
                    userAgent: userAgent
                )
            } catch {}
            try await DigiDocConf.initDigiDoc(
                isLoggingEnabled: isLoggingEnabled,
                tsaOption: getTSAOption(),
                tsaUrl: getTSAUrl(),
                tsaCert: getTSACert(),
                sivaOption: getSiVaOption(),
                sivaUrl: getSiVaUrl(),
                sivaCert: getSiVaCert(),
                proxyInfo: proxyInfo,
                userAgent: userAgent
            )

            await CryptoContainer.enableLogging(isLoggingEnabled)

            let configurationProvider = await configurationRepository.getConfiguration()

            await cryptoSetup.setLdapConfig(configurationProvider)
            await cryptoSetup.setCdoc2Config(configurationProvider)
            await cryptoSetup.setCdoc2Settings(configurationProvider)

            try saveLDAPCertsToLibrary(ldapCertsBundle: configurationProvider?.ldapCerts)
        } catch let error {}
    }

Clone this wiki locally