Пример работы с цифровой подписью

Для работы с цифровой подписью создайте приложение «HHFWDss», в котором используются методы фреймворка:

Имя метода Краткое описание
initWithCredentials (_: host: environment: project: device:) Метод выполняет инициализацию фреймворка.
auth (_: password:) Метод выполняет аутентификацию пользователя по логину и паролю.
getCertificatesWithPassword (_: handler:) Метод возвращает список сертификатов.
signCertificate (withResource: table: params: column: hhiveId: password: certificateId: certificatePin: handler:) Метод отправляет документ на подпись.
signs (handler:) Метод возвращает список цифровых подписей, которые были созданы текущим пользователем.
remove (withSignId: handler:) Метод удаляет цифровую подпись.

Вспомогательные методы:

Имя метода Краткое описание
getSignatureId(from:) Метод возвращает значение для ключа «signature_id» из json-результата запроса для подписи ресурса.
Тип возвращаемых данных: Int?
parseServerJSONResponse(json:) Метод возвращает результат преобразования json-словаря «NSDictionary» в словарь «[String: Any]?».
Тип возвращаемых данных: [String: Any]?
getResponseStatus(from:) Метод возвращает значение для ключа «status» из json-результата запроса.
Тип возвращаемых данных: String?

Приложение «HHFWDss» состоит из одного экрана, текстового представления «UITextView», текстового поля «UITextField» и кнопок «UIButton»:

Примечание. При загрузке приложения выполняется аутентификация, кнопки недоступны. Если аутентификация выполнена успешно, то кнопки будут доступны и в текстовом поле появится надпись «Authentication success».

Для выполнения примера:

  1. Нажмите кнопку «Get certificates».

При нажатии на кнопку инициируется запрос списка всех сертификатов пользователя. Ответ содержит сертификаты, доступные текущему пользователю. Для подписи ячеек определенным сертификатом в таблицах используется идентификатор сертификата «certificateId».

  1. Нажмите кнопку «Get signatures».

При нажатии на кнопку возвращается история подписей, которые созданы текущим пользователем. Список истории подписей пуст.

  1. Нажмите кнопку «Sign document».

При нажатии на кнопку инициируется подпись ячейки с параметрами: ресурс «GetBudgetPlanning», таблица «ПланированиеБюджета», параметры «{}», колонка «Номер», «hhiveId = 1». Также выбран сертификат идентификатором «12831». Сервер мобильной платформы возвращает идентификатор подписи «{signature_id: 121}».

  1. Нажмите кнопку «Get signatures» для получения истории подписей.

В списке истории подписей появится новая подпись.

  1. Введите в текстовое поле идентификатор подписи «121» для удаления.

  2. Нажмите кнопку «Remove signature».

При нажатии на кнопку удалится подпись с заданным идентификатором «121». При успешном удалении сервер мобильной платформы возвращает пустой ответ со статусом «ok».

Для проверки удаления подписи нажмите кнопку «Get signatures». При нажатии на кнопку возвращается список истории подписей, которые созданы текущим пользователем. В списке не содержится подпись с идентификатором «121».

Код приложения:

import UIKit
 
class ViewController: UIViewController {
 
    // Определим выходные переменные
    @IBOutlet weak var signatureIDTextField: UITextField!
    @IBOutlet weak var resultTextView: UITextView!
    @IBOutlet weak var getCertificatesButton: UIButton!
    @IBOutlet weak var signButton: UIButton!
    @IBOutlet weak var getSignsButton: UIButton!
    @IBOutlet weak var removeSignButton: UIButton!
 
    // Переопределим метод
    override func viewDidLoad() {
        super.viewDidLoad()
        self.deactivateButtons()
        self.initializeFramework()
        self.auth {
            self.activateButtons()
            self.resultTextView.text = "Authentication success"
        }
    }
 
    // Зададим метод, который будет выполняться при нажатии на кнопку
    @IBAction func getCertificatesPressed(_ sender: UIButton) {
        self.getCertificatesDSS { (jsonResult) in
            self.resultTextView.text = String(format: "%@", jsonResult)
        }
    }
 
    @IBAction func signPressed(_ sender: UIButton) {
        self.signDSS { (jsonResult) in
            self.resultTextView.text = String(format: "%@", jsonResult)
            if let signatureId = self.getSignatureId(from: jsonResult) {
                self.signatureIDTextField.text = String(signatureId)
            } else {
                self.signatureIDTextField.text = ""
            }
        }
    }
 
    @IBAction func getSignsPressed(_ sender: UIButton) {
        self.getSignsDSS { (jsonResult) in
            self.resultTextView.text = String(format: "%@", jsonResult)
        }
    }
 
    @IBAction func removeSignPressed(_ sender: UIButton) {
        if let signatureId = Int(self.signatureIDTextField.text ?? "") {
            self.removeSign(signatureId) { (jsonResult) in
                self.resultTextView.text = String(format: "%@", jsonResult)
            }
        }
    }
 
    // Выполним инициализацию фреймворка
    private func initializeFramework() {
        let apiVersion: String = "v1"
        let host: String = "http://testmasterfmp.fsight.cloud/"
        let environment: String = "Leonid_environment"
        let project: String = "Leonid_project"
        let device: String = (UIDevice.current.identifierForVendor?.uuidString)!
        HHFWController.sharedInstance().initWithCredentials(
            apiVersion,
            host: host,
            environment: environment,
            project: project,
            device: device
        )
    }
 
    // Выполним аутентификацию
     private func auth(completion: @escaping ()->()) {
        let username: String = "Leonid"
        let password: String = "123123"
        HHFWController.sharedInstance().auth(username, password: password){ (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Auth success")
                completion()
            } else {
                print("Auth error")
            }
        }
    }
 
    // Получим список доступных сертификатов
    private func getCertificatesDSS(completion: @escaping (NSDictionary)->()) {
        let dssPassword = "Saprun123"
        HHFWController.sharedInstance().getCertificatesWithPassword(dssPassword) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Get certificates success")
                completion(jsonDict)
            } else {
                print("Get certificates error")
            }
        }
    }
 
    // Подпишем ресурс сертификатом
    private func signDSS(completion: @escaping (NSDictionary)->()) {
        let resourceName = "GetBudgetPlanning"
        let tableName = "ПланированиеБюджета"
        let params = "{}"
        let column = "Номер"
        let hhiveId = "1"
        let dssPassword = "Saprun123"
        let certificateId = "12831"
        let certificatePin = "123"
        HHFWController.sharedInstance().signCertificate(
            withResource: resourceName,
            table: tableName,
            params: params,
            column: column,
            hhiveId: hhiveId,
            password: dssPassword,
            certificateId: certificateId,
            certificatePin: certificatePin
        ) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Sign resource success")
                completion(jsonDict)
            } else {
                print("Sign resource error")
            }
        }
    }
 
    // Получим подписи
    private func getSignsDSS(completion: @escaping (NSDictionary)->()) {
        HHFWController.sharedInstance().signs { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Signs success")
                completion(jsonDict)
            } else {
                print("Signs error")
            }
        }
    }
 
    // Удалим подпись
    private func removeSign(_ signatureId: Int, completion: @escaping (NSDictionary)->()) {
        HHFWController.sharedInstance().remove(withSignId: signatureId) { (jsonResult) in
            if let jsonDict = jsonResult as? NSDictionary,
                let status = jsonDict["status"] as? String, status == "ok" {
                print("Remove sign success")
                completion(jsonDict)
            } else {
                print("Remove sign error")
            }
        }
    }
 
    // Вызовем вспомогательные классы
    private func getSignatureId(from json: NSDictionary) -> Int? {
        var resultSignatureId: Int? = nil
        let jsonDict = parseServerJSONResponse(json: json)
        if self.getResponseStatus(from: jsonDict) == "ok" {
            if let result = jsonDict?["result"] as? [String: Any],
                let raw = result["raw"] as? [String:Any],
                let signatureId = raw["signature_id"] as? Int {
                resultSignatureId = signatureId
            }
        }
        return resultSignatureId
    }
 
    func parseServerJSONResponse(json: NSDictionary) -> [String: Any]? {
        return json as? [String: Any]
    }
 
    func getResponseStatus(from json: [String: Any]?) -> String? {
        return json?["status"] as? String
    }
 
    // Зададим методы для отображения элементов пользовательского интерфейса приложения
    private func deactivateButtons() {
        self.getCertificatesButton.isEnabled = false
        self.signButton.isEnabled = false
        self.getSignsButton.isEnabled = false
        self.removeSignButton.isEnabled = false
    }
 
    private func activateButtons() {
        self.getCertificatesButton.isEnabled = true
        self.signButton.isEnabled = true
        self.getSignsButton.isEnabled = true
        self.removeSignButton.isEnabled = true
    }
}

См. также:

Примеры использования iOS-фреймворка