---
title: "Strategies for multiple bundle IDs"
canonical_url: "https://www.nutrient.io/guides/ios/faq/strategies-for-multiple-bundle-ids/"
md_url: "https://www.nutrient.io/guides/ios/faq/strategies-for-multiple-bundle-ids.md"
last_updated: "2026-06-09T10:22:07.663Z"
description: "Learn strategies to manage multiple bundle IDs effectively, enhance project security, and streamline license handling without recompiling your app."
---

Nutrient licenses are based on a [bundle ID](https://www.nutrient.io/../../faq/what-is-a-bundle-id/). For projects that require many different bundle IDs, there are a few strategies we recommend in order to simplify dealing with more than one bundle ID:

1. Your app can connect to a server and fetch a license on the fly. This will increase your control and the security of the project you release and completely solve the need to recompile. The request might contain the bundle ID. It also checks with a database to see if a Nutrient license exists for the bundle ID and returns it if found. This result can also be cached, so internet access is only required on the first start. Since most applications also require some sort of server/backend/login access, this can be transferred as part of the initial login.

2. The project can be set up to read the license from the `Info.plist` file, and every app variant is set up to have a separate `Info.plist`. In this way, no code will need to be recompiled; all that will be required is building a new IPA with the updated data. Editing the `Info.plist` file can be automated so that the entire workflow doesn’t need manual work.

3. Simply check for the bundle ID at runtime and set the correct license for the bundle ID, or else exit the application. This is the most straightforward way to do this, and you’ll immediately notice when a license is missing.

We strongly recommend having one central place in your application that handles licensing, ideally very early in the application start lifecycle. `applicationWillFinishLaunching:` is the spot we recommend, so as to not risk calling the license key too late:

### SWIFT

```swift

switch Bundle.main.bundleIdentifier {
case "com.mycompany.myapp":
    PSPDFKitGlobal.setLicenseKey("LICENSE_FOR_MYAPP")
case "com.othercompany.whitelabelapp":
    PSPDFKitGlobal.setLicenseKey("LICENSE_FOR_WHITELABEL1")
case "com.othercompany.whitelabelapp2":
    PSPDFKitGlobal.setLicenseKey("LICENSE_FOR_WHITELABEL2")
default:
    fatalError("Missing PSPDFKit license for \(Bundle.main.bundleIdentifier)")
}

```

### OBJECTIVE-C

```objc

NSString *bundleID = [[NSBundle mainBundle] bundleIdentifier];
if ([bundleID isEqualToString:@"com.mycompany.myapp"]) {
     [PSPDFKitGlobal setLicenseKey:@"LICENSE_FOR_MYAPP"];
} else if ([bundleID isEqualToString:@"com.othercompany.whitelabelapp"]) {
     [PSPDFKitGlobal setLicenseKey:@"LICENSE_FOR_WHITELABEL1"];
} else if ([bundleID isEqualToString:@"com.othercompany.whitelabelapp2"]) {
     [PSPDFKitGlobal setLicenseKey:@"LICENSE_FOR_WHITELABEL2"];
} else {
    NSLog(@"Missing PSPDFKit license for %@", bundleID);
    abort();
}

```

## Embedding Nutrient without a license

You can embed `PSPDFKit.xcframework` and `PSPDFKitUI.xcframework` without a license as well. As long as no PSPDF* classes are called, this is something we tolerate as part of mixed projects where some customers have a Nutrient license and some don’t. You need to set the license before accessing any of our classes or functions; otherwise, Nutrient will complain in the log and your program will exit.
---

## Related pages

- [Advanced CocoaPods integration](/guides/ios/miscellaneous/advanced-cocoapods-integration.md)
- [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)
- [Customizing The Page Number](/guides/ios/customizing-pdf-pages/customizing-the-page-number.md)
- [Carthage integration](/guides/ios/best-practices/carthage-integration.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)
- [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)
- [iOS PDF SDK security](/guides/ios/faq/sdk-security.md)
- [Saving Data Externally](/guides/ios/memory-and-storage/saving-data-externally.md)
- [Third Party Compatibility](/guides/ios/miscellaneous/third-party-compatibility.md)
- [Transferring File Edits To A Server](/guides/ios/best-practices/transferring-file-edits-to-a-server.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)
- [Version Numbering](/guides/ios/best-practices/version-numbering.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)

