---
title: "Migrating to the Advanced Digital Signatures API"
canonical_url: "https://www.nutrient.io/guides/ios/migration-guides/migrating-to-advanced-digital-signatures-api/"
md_url: "https://www.nutrient.io/guides/ios/migration-guides/migrating-to-advanced-digital-signatures-api.md"
last_updated: "2026-06-08T08:09:41.310Z"
description: "Comprehensive upgrade guide for Nutrient iOS SDK covering version migrations, breaking changes, and new features."
---

This guide covers migrating from the old digital signing API using [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) to the new advanced digital signatures API. This API, which was released alongside [PSPDFKit 13.2 for iOS](https://www.nutrient.io/guides/ios/changelog.md#13.2.0), is available as a method on [`Document`](https://www.nutrient.io/api/ios/documentation/pspdfkit/document).

The [`sign(_:withCertificate...`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner/sign(_:withcertificate:writeto:completionblock:)-4xikv) APIs of [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) will soon be deprecated, but the new API has complete support for PAdES signatures, including timestamping support. [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) allows passing a name, which is considered unsafe, as this could be interpreted as a form of identity theft. The newer API mitigates this risk by using the name saved in the signing certificate.

We strongly encourage you to migrate to the new advanced digital signatures API, as it not only provides extensive functionality, but it’s also more streamlined and easier to use.

A subset of features on [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) and its subclasses should be migrated to the advanced digital signatures API as described below.

### Signing a FormElement

For advanced digital signatures, use [`Document.sign(formElement:configuration:outputDataProvider:)`](https://www.nutrient.io/api/ios/documentation/pspdfkit/document/sign(formelement:configuration:outputdataprovider:)) to sign a form field instead of the [`sign(_:withCertificate...`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner/sign(_:withcertificate:writeto:completionblock:)-4xikv) APIs available on [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) and its subclasses. Note that the often-used APIs — such as [`sign(_:usingPassword:writeTo:)`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pkcs12signer/sign(_:usingpassword:writeto:completion:)) and its variants on [`PKCS12Signer`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pkcs12signer), which is a subclass of [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) — will be deprecated soon.

The new API, like the outgoing [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) API, takes the [`SignatureFormElement`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signatureformelement) to be signed and a data provider implementing [`DataProviding`](https://www.nutrient.io/api/ios/documentation/pspdfkit/dataproviding) to specify the destination of the signed document. The entire configuration of the signature is housed under the new [`SigningConfiguration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration) API, which aids discoverability. The private key and the certificate for signing need to be provided to the [`SigningConfiguration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration) instance instead of the `PDFSigner.sign(_:withCertificate:...)` API:

```swift

let configuration: SigningConfiguration =...
try await unsignedDocument.sign(formElement: signatureFormElement, configuration: configuration, outputDataProvider: FileDataProvider(fileURL: signedDocumentURL))

```

### Using SigningConfiguration for Signature Customizations

Specify the signature type ([`PDFSignatureType`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsignaturetype)) using [`SigningConfiguration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration) instead of the [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) instance.

Customizations such as signature appearance, biometric data, estimated size, and hashing algorithm, which required implementing [`PDFDocumentSignerDataSource`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfdocumentsignerdatasource), have now been added to the [`SigningConfiguration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration) API that’s supplied while signing the element.

Instead of implementing the [`PDFDocumentSignerDataSource`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfdocumentsignerdatasource) protocol, you can provide the signature appearance, biometric data, estimated size, hashing algorithm, and more to the [`SigningConfiguration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration) instance directly. The signature appearance and biometric data are still represented using the same types of [`PDFSignatureAppearance`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsignatureappearance) and [`PDFSignatureBiometricProperties`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsignaturebiometricproperties), respectively.

With this new API, the encryption algorithm is now chosen automatically based on the signing configuration, so you no longer have to specify it like before with [`PDFSigner`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsigner) APIs.

The reason for signing and the location of signing should also be provided to the [`SigningConfiguration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration) instance instead of the [`PDFSigner`] instance.

The API also supports timestamping by providing the URL for the timestamping authority server to the [`SigningConfiguration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration) instance.

All of the above-mentioned customization options are optional, and the [`SigningConfiguration`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration) only requires its data signer and signing certificates to be specified for intialization. The certificates still use the same API of [`X509`](https://www.nutrient.io/api/ios/documentation/pspdfkit/x509). The data signer is an instance that implements the [`DataSigning`](https://www.nutrient.io/api/ios/documentation/pspdfkit/datasigning) protocol. In some cases, this will be the private key ([`PrivateKey`](https://www.nutrient.io/api/ios/documentation/pspdfkit/privatekey)) instance that you’ll have after unlocking a PKCS#12 blob using the [`PKCS12.unlockCertificateChain(withPassword:)`] API:

```swift

// Default initializer.
let defaultInitConfig = SigningConfiguration(dataSigner: privateKey, certificates: certificates)

```

```swift

let privateKey: PrivateKey =...
let certificates: [X509] =...
let timestampSource: URL =...
let customAppearance: PDFSignatureAppearance =...
let biometricData: PDFSignatureBiometricProperties =...

// Custom initializer with all components.
let signingConfiguration = SigningConfiguration(type:.pades, dataSigner: privateKey, certificates: certificates, hashAlgorithm:.SHA256, appearance: customAppearance, estimatedSize: 16_384, reason: "I approve", location: "End of the Universe", timestampSource: timestampSource, biometricData: biometricData)

```

### Custom Signing

The [`DataSigning`](https://www.nutrient.io/api/ios/documentation/pspdfkit/datasigning) protocol mentioned above comes in handy when you want to implement your custom signing — for example, if you want to send your data to a server for signing. Use a custom implementation of [`DataSigning.sign(unsignedData:hashAlgorithm:)`](https://www.nutrient.io/api/ios/documentation/pspdfkit/datasigning/sign(unsigneddata:hashalgorithm:)) instead of implementing the [`PDFDocumentSignerDelegate`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfdocumentsignerdelegate) API:

```swift

// Custom implementation of `DataSigning` to carry out the signing.
private class CustomDataSigner: DataSigning {
    func sign(unsignedData: Data, hashAlgorithm: PDFSignatureHashAlgorithm) async throws -> (signedData: Data, dataFormat: PSPDFKit.SignedDataFormat) {
        // Carry out your custom data signing.
        let signedData =...

        // Return the signed data specifying the data format.
        // Use `.pkcs7` if the data has been wrapped in a PKCS#7 signature container.

        // Otherwise, use `genericSignedData`.
        return (signedData,.genericSignedData)
    }
}

```
---

## Related pages

- [14 9 Migration Guide](/guides/ios/migration-guides/14-9-migration-guide.md)
- [14 2 Migration Guide](/guides/ios/migration-guides/14-2-migration-guide.md)
- [Pspdfkit 10 3 Migration Guide](/guides/ios/migration-guides/pspdfkit-10-3-migration-guide.md)
- [Migrate to electronic signatures](/guides/ios/migration-guides/migrating-to-electronic-signatures.md)
- [Pspdfkit 10 Migration Guide](/guides/ios/migration-guides/pspdfkit-10-migration-guide.md)
- [Migrating From Apple Pdfkit](/guides/ios/migration-guides/migrating-from-apple-pdfkit.md)
- [Pspdfkit 10 4 Migration Guide](/guides/ios/migration-guides/pspdfkit-10-4-migration-guide.md)
- [Pspdfkit 11 3 Migration Guide](/guides/ios/migration-guides/pspdfkit-11-3-migration-guide.md)
- [Pspdfkit 11 5 Migration Guide](/guides/ios/migration-guides/pspdfkit-11-5-migration-guide.md)
- [Pspdfkit 12 2 Migration Guide](/guides/ios/migration-guides/pspdfkit-12-2-migration-guide.md)
- [Pspdfkit 13 3 Migration Guide](/guides/ios/migration-guides/pspdfkit-13-3-migration-guide.md)
- [Pspdfkit 13 Migration Guide](/guides/ios/migration-guides/pspdfkit-13-migration-guide.md)
- [Pspdfkit 12 3 Migration Guide](/guides/ios/migration-guides/pspdfkit-12-3-migration-guide.md)
- [Pspdfkit 3 Migration Guide](/guides/ios/migration-guides/pspdfkit-3-migration-guide.md)
- [Pspdfkit 11 4 Migration Guide](/guides/ios/migration-guides/pspdfkit-11-4-migration-guide.md)
- [Pspdfkit 6 5 Migration Guide](/guides/ios/migration-guides/pspdfkit-6-5-migration-guide.md)
- [Pspdfkit 4 Migration Guide](/guides/ios/migration-guides/pspdfkit-4-migration-guide.md)
- [Pspdfkit 12 Migration Guide](/guides/ios/migration-guides/pspdfkit-12-migration-guide.md)
- [Pspdfkit 5 Migration Guide](/guides/ios/migration-guides/pspdfkit-5-migration-guide.md)
- [Pspdfkit 6 Migration Guide](/guides/ios/migration-guides/pspdfkit-6-migration-guide.md)
- [Pspdfkit 7 6 Migration Guide](/guides/ios/migration-guides/pspdfkit-7-6-migration-guide.md)
- [Pspdfkit 9 2 Migration Guide](/guides/ios/migration-guides/pspdfkit-9-2-migration-guide.md)
- [Upgrading](/guides/ios/getting-started/upgrading.md)
- [Pspdfkit 9 4 Migration Guide](/guides/ios/migration-guides/pspdfkit-9-4-migration-guide.md)
- [Pspdfkit 9 3 Migration Guide](/guides/ios/migration-guides/pspdfkit-9-3-migration-guide.md)
- [Migrate to PSPDFKit 7 with ease](/guides/ios/migration-guides/pspdfkit-7-migration-guide.md)
- [Pspdfkit 9 Migration Guide](/guides/ios/migration-guides/pspdfkit-9-migration-guide.md)
- [Pspdfkit 9 5 Migration Guide](/guides/ios/migration-guides/pspdfkit-9-5-migration-guide.md)
- [PSPDFKit 8 migration guide for iOS developers](/guides/ios/migration-guides/pspdfkit-8-migration-guide.md)

