---
title: "iOS PDF SDK security | Nutrient"
canonical_url: "https://www.nutrient.io/guides/ios/faq/sdk-security/"
md_url: "https://www.nutrient.io/guides/ios/faq/sdk-security.md"
last_updated: "2026-05-25T14:09:00.318Z"
description: "Nutrient iOS SDK has been implemented using the latest and best security practices and is used in security-conscious applications."
---

# iOS PDF SDK security

Nutrient iOS SDK has been implemented using the latest and best security practices and is used in security-conscious applications.

- Nutrient iOS SDK supports [iOS Data Protection](https://www.apple.com/business/docs/iOS_Security_Guide.pdf).

- Encrypted PDFs are supported and cannot be accessed without the matching password.

- PDF passwords are never persisted.

- [`AESCryptoDataProvider`](https://www.nutrient.io/api/ios/documentation/pspdfkit/aescryptodataprovider) allows you to access encrypted documents by decrypting only the parts that are required to render the page. The parts are dynamically decrypted in memory instead of the entire file being decrypted.

- [`Document`](https://www.nutrient.io/api/ios/documentation/pspdfkit/document) can be initialized with a `Data` object for custom encryption.

- Signatures are saved in the secure keychain.

- Customers are using Nutrient iOS SDK with GOOD, Mobile Iron, and AirWatch.

- Code commits are always peer reviewed and have to pass our large test case set before being merged.

- We use a large set of compiler warnings and the latest version of Clang Analyzer to detect and fix potential problems before the product is released.

## Permissions

Nutrient iOS SDK has optional features, including adding images or recording sound annotations. If you allow these in your app, make sure to [set the required permissions in your `Info.plist` file](https://www.nutrient.io/../../getting-started/permissions/).

## Security exceptions

Client applications can implement a custom [`ApplicationPolicy`](https://www.nutrient.io/api/ios/documentation/pspdfkit/applicationpolicy) class that manages security-related callbacks. By default, Nutrient iOS SDK will use a standard implementation that allows all special actions. However, you can modify this if you’re in a restricted environment. The following security actions are currently tracked:

### SWIFT

```swift

public let.openIn: PolicyEvent
public let.print: PolicyEvent
public let.email: PolicyEvent
public let.message: PolicyEvent
public let.quickLook: PolicyEvent
public let.audioRecording: PolicyEvent
public let.camera: PolicyEvent
public let.photoLibrary: PolicyEvent
public let.pasteboard: PolicyEvent // includes Copy/Paste
public let.submitForm: PolicyEvent
public let.network: PolicyEvent

```

### OBJECTIVE-C

```objc

PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventOpenIn;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventPrint;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventEmail;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventMessage;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventQuickLook;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventAudioRecording;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventCamera;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventPhotoLibrary;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventPasteboard; // includes Copy/Paste
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventSubmitForm;
PSPDF_EXPORT PSPDFPolicyEvent const PSPDFPolicyEventNetwork;

```

### SWIFT

```swift

class DisallowCopyApplicationPolicy: NSObject, ApplicationPolicy {

    func hasPermission(forEvent event: PolicyEvent, isUserAction: Bool) -> Bool {
        if event ==.pasteboard {
            return false
        }
        return true
    }

}

```

### OBJECTIVE-C

```objc

@interface PSCDisallowCopyApplicationPolicy : NSObject <PSPDFApplicationPolicy> @end

@implementation PSCDisallowCopyApplicationPolicy

- (BOOL)hasPermissionForEvent:(PSPDFPolicyEvent)event isUserAction:(BOOL)isUserAction {
    if ([event isEqualToString:PSPDFPolicyEventPasteboard]) {
        return NO;
    }
    return YES;
}

@end

```

You can register a custom [`ApplicationPolicy`](https://www.nutrient.io/api/ios/documentation/pspdfkit/applicationpolicy) instance by calling [`SDK.setLicenseKey(_:options:)`](https://www.nutrient.io/api/ios/documentation/pspdfkit/sdk/setlicensekey(_:options:)). Nutrient iOS SDK expects your instance to be set in the options dictionary under the [`SDK.Setting.applicationPolicy`](https://www.nutrient.io/api/ios/documentation/pspdfkit/sdk/setting/applicationpolicy) key.

## Cache

Rendered pages will be cached to disk by default to ensure fast display and browsing. The disk cache can be customized on a [per-document level via the `useDiskCache` property](https://www.nutrient.io/api/ios/documentation/pspdfkit/document/usediskcache) and for a [data provider](https://www.nutrient.io/api/ios/documentation/pspdfkit/dataproviding/usediskcache), and it can also be disabled globally by setting its [`allowedDiskSpace`](https://www.nutrient.io/api/ios/documentation/pspdfkit/diskcache/alloweddiskspace) to `0`.

Refer to the [rendering PDF pages](https://www.nutrient.io/../../getting-started/rendering-pdf-pages/#the-cache) guide for more details.

There are also specific hooks to add a custom crypto layer to the disk cache. See [`decryptionHelper`](https://www.nutrient.io/api/ios/documentation/pspdfkit/diskcache/decryptionhelper) and [`encryptionHelper`](https://www.nutrient.io/api/ios/documentation/pspdfkit/diskcache/encryptionhelper).

Implementing a custom crypto layer might decrease performance slightly, but it’s hardly noticeable on modern devices. Nutrient iOS SDK Catalog contains sample code using the open source [RNCryptor](https://github.com/RNCryptor/RNCryptor).

## Security-related considerations

- Nutrient iOS SDK might keep parts of extracted text, annotations, or passwords in memory to perform the requested operations. If rogue code has access to your application’s memory, there’s nothing you can do and the device has already been compromised. This could happen if a device is jailbroken.

- Taking a screenshot cannot be prevented on iOS. There’s a `UIApplicationUserDidTakeScreenshotNotification` notification that’s sent when the user takes a screenshot using the Lock+Home Button combination, however, there are other ways to make screenshots that won’t emit such a notification (like using Xcode’s Device Manager).

- Using `Document` with data in memory using [`DataContainerProvider`](https://www.nutrient.io/api/ios/documentation/pspdfkit/datacontainerprovider) will only work for documents that are small enough to fit into the available process memory space. This is device and state dependent. When saving annotations, the `NSData` object is mutated, and you can use the document delegate [`pdfDocumentDidSave(_:)`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfdocumentdelegate/pdfdocumentdidsave(_:)) to save the data object back to your (encrypted) disk store. However, it’s strongly recommended to use [`AESCryptoDataProvider`](https://www.nutrient.io/api/ios/documentation/pspdfkit/aescryptodataprovider) or a custom implementation of [`DataProviding`](https://www.nutrient.io/api/ios/documentation/pspdfkit/dataproviding) to avoid loading the entire file in memory.

## Network access

Nutrient iOS SDK only performs network access when required for following actions:

- Submitting a PDF form

- Accessing images/videos/audio from the gallery (www.youtube.com, img.youtube.com)

- Looking up text in Wikipedia (%@.m.wikipedia.org)

- Via the inline web browser if a URL was tapped ([`WebViewController`](https://www.nutrient.io/api/ios/documentation/pspdfkitui/webviewcontroller))

- Adding or verifying digital signatures:
  - Verifying the timestamp of a digital signature (via [Botan](https://botan.randombit.net/))
  - Adding a timestamp to a digital signature (when [`SigningConfiguration.timeStampSource`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration/timestampsource) is set while signing)
  - Adding LTV information when signing a document (if [`SigningConfiguration.isLongTermValidationEnabled`](https://www.nutrient.io/api/ios/documentation/pspdfkit/signingconfiguration/timestampsource) is enabled while signing)
  - Checking the revocation status for a digital signature (in [`PDFSignatureValidator`](https://www.nutrient.io/api/ios/documentation/pspdfkit/pdfsignaturevalidator) and [`SignedFormElementViewController`](https://www.nutrient.io/api/ios/documentation/pspdfkitui/signedformelementviewcontroller))

Production license verification happens offline and does not ping our servers.

## Data collection practices

Nutrient iOS SDK doesn’t collect any data from production applications. Refer to our [Privacy Policy](https://www.nutrient.io/legal/privacy) for more information.

When using [Nutrient Instant](https://pspdfkit.com/instant/), user data such as the user ID and name (i.e. the annotation author name) will be sent to the Instant server. User photos can be uploaded as well if the user is creating image annotations, and user audio recordings can be uploaded when sound annotations are used. Since the Instant server is self-hosted, this data never reaches any Nutrient servers.

## Copy text

PDF documents have a flag that indicates if copying text is allowed, which is reflected in the `DocumentPermissions.extract` flag in the [`permissions`](https://www.nutrient.io/api/ios/documentation/pspdfkit/document/permissions) property of [`Document`](https://www.nutrient.io/api/ios/documentation/pspdfkit/document). This is a read-only property that cannot be changed.

To disable copying text when a PDF allows it, implement the [`ApplicationPolicy`](https://www.nutrient.io/api/ios/documentation/pspdfkit/applicationpolicy) protocol in a custom class as explained above.

## Cryptographic libraries

Nutrient iOS SDK uses the Apple-provided [CommonCrypto](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/Common%20Crypto.3cc.html) library for [AES-256 decryption](https://www.nutrient.io/guides/ios/security/aesdataprovider.md), licensing, Digital Signatures, and some platform-specific functionality. In addition, it uses the [Botan](https://botan.randombit.net/) library for licensing and Digital Signatures, and it also relies on a few document encryption routines provided by the [PDFium](https://pdfium.googlesource.com) library.

For the complete list of third-party libraries used in Nutrient iOS SDK, check out the [acknowledgements](https://www.nutrient.io/legal/acknowledgements/ios-acknowledgements).
---

## Related pages

- [Advanced Carthage integration](/guides/ios/miscellaneous/advanced-carthage-integration.md)
- [Airdrop](/guides/ios/features/airdrop.md)
- [App Transport Security](/guides/ios/pspdfkit-instant/app-transport-security.md)
- [Bitcode](/guides/ios/faq/bitcode.md)
- [Carthage integration](/guides/ios/best-practices/carthage-integration.md)
- [Customizing The Page Number](/guides/ios/customizing-pdf-pages/customizing-the-page-number.md)
- [Framework Size](/guides/ios/faq/framework-size.md)
- [Customizing the log level on iOS](/guides/ios/features/logging.md)
- [Nightly Builds](/guides/ios/best-practices/nightly-builds.md)
- [About Memory Usage](/guides/ios/memory-and-storage/about-memory-usage.md)
- [Advanced CocoaPods integration](/guides/ios/miscellaneous/advanced-cocoapods-integration.md)
- [Optimize PDF documents for mobile rendering on iOS](/guides/ios/miscellaneous/optimize-pdf-documents-for-mobile-rendering.md)
- [Modifying permissions in your iOS app](/guides/ios/getting-started/permissions.md)
- [Powered By Nutrient](/guides/ios/miscellaneous/powered-by-nutrient.md)
- [Reduce App Size](/guides/ios/best-practices/reduce-app-size.md)
- [Saving Data Externally](/guides/ios/memory-and-storage/saving-data-externally.md)
- [Strategies For Multiple Bundle Ids](/guides/ios/faq/strategies-for-multiple-bundle-ids.md)
- [Third Party Compatibility](/guides/ios/miscellaneous/third-party-compatibility.md)
- [Using Automatic Saving Safely](/guides/ios/best-practices/using-automatic-saving-safely.md)
- [Using Document Efficiently](/guides/ios/getting-started/using-document-efficiently.md)
- [Transferring File Edits To A Server](/guides/ios/best-practices/transferring-file-edits-to-a-server.md)
- [Manage your iOS status bar with view controllers](/guides/ios/faq/view-controller-based-status-bar-appearance.md)
- [Youtube Links](/guides/ios/miscellaneous/youtube-links.md)
- [Version Numbering](/guides/ios/best-practices/version-numbering.md)

