eSign PDFs with a Certificate on iOS

This guide shows how Electronic Signatures and Digital Signatures can be used together.

To let a user create a signature drawing using the Electronic Signatures UI, which you’ll in turn use to create a digital signature, you can present a SignatureCreationViewController and implement its delegate, SignatureCreationViewControllerDelegate, and get a callback to when the user finished. You can use the drawView property on the view controller to extract the drawn image from it.

Using this in practice could look something like this:

let signatureController = SignatureCreationViewController()
var configuration = SignatureCreationViewController.Configuration()
configuration.availableModes = [.draw]
signatureController.configuration = configuration
signatureController.delegate = self
pdfController.present(signatureController, animated: true)

func signatureCreationViewControllerDidFinish(_ signatureController: SignatureCreationViewController) {
	 signatureController.dismiss(animated: true)
	 guard let signatureFormElement = document.annotations(at: pageIndex, type: SignatureFormElement.self).first else { return }
     let url = URL(fileURLWithPath: NSTemporaryDirectory().appending("\(UUID().uuidString).pdf"))
 
     guard let pageInfo = document.pageInfoForPage(at: 0) else { return }
     let valueLines = signatureController.drawView.pointSequences.map { $0.map({ NSValue.valueWithDrawingPoint($0) }) }
     let lines = ConvertViewLines(pdfLines: valueLines, pageInfo: pageInfo, viewBounds: CGRect(origin: .zero, size: pageInfo.size))
     let inkAnnotation = InkAnnotation(lines: lines.map { $0.map({ $0.drawingPointValue }) })
 
     // Create the `UIImage` from the ink annotation in your `SignatureViewController`.
     guard let image = inkAnnotation.image(size: inkAnnotation.boundingBox.size, options: nil) else { return }
 
     let appearance = PDFSignatureAppearance { builder in
          builder.signatureGraphic = Annotation.AppearanceStream(image: image)
     }
     let p12data: Data // PSCKS12 data.
     let p12 = PKCS12(data: p12data)
     Task {
         let (certificates, privateKey) = try p12.unlockCertificateChain(withPassword: "test")
         try await document.sign(formElement: signatureFormElement, configuration: SigningConfiguration(dataSigner: privateKey, certificates: certificates, appearance: appearance), outputDataProvider: FileDataProvider(fileURL: url))
         pdfController.document = Document(url: url)
    }