- Getting started
- Project description
- Project description helpers
- App Extensions
- Accessing resources
- Third-party dependencies
- Caching dependencies
- Microfeatures architecture
- Managing versions
- Adoption guidelines
- Best practices
- Frequently asked questions
- Edit your projects
- Generate projects
- Focus on targets
- Sign your apps
- Build schemes
- Scaffold files
- Project graph
- Set up environment
- Migrate Xcode projects
- Generate documentation
- Generate secrets
- Clean the local environment
iOS applications have a wide range of app extension types (Notification Service, Intents, Widgets, etc…).
Some of those extensions have dedicated product types (e.g.
.messagesExtension), while others may be represented
using the generic
.appExtension product type.
For example, this is how a Notification Service Extension can be declared:
let project = Project(name: "App",targets: [Target(name: "App",platform: .iOS,product: .app,bundleId: "io.tuist.App",infoPlist: "Info.plist",sources: ["Sources/**"],dependencies: [.target(name: "NotificationServiceExtension"),]),Target(name: "NotificationServiceExtension",platform: .iOS,product: .appExtension,bundleId: "io.tuist.App.NotificationServiceExtension",infoPlist: .extendingDefault(with: ["CFBundleDisplayName": "$(PRODUCT_NAME)","NSExtension": ["NSExtensionPointIdentifier": "com.apple.usernotifications.service","NSExtensionPrincipalClass": "$(PRODUCT_MODULE_NAME).NotificationService"]]),sources: "NotificationServiceExtension/**",dependencies: ),])
Info Plist Keys
Different app extensions have a different set of
Info.plist key requirements, one of the main ones is the
NSExtensionPointIdentifier key that identifies the extension type.
For example, here is a list of some of the extension types and their corresponding identifier value:
|Intents UI Extension|
Knowing the different key/value requirements may be needed when leveraging the auto-generated
Info.plist file (see Info Plist).
To find out what the identifier for an extension type is or any other required key, you can examine the values within an existing
Info.plist file (if one exists),
or create a new sample project using the Xcode UI with the desired app extension target and examine the
Info.plist file created by Xcode.
Associating Extensions With Applications
To associate or include extensions within an application, the application target needs to declare a dependency on the corresponding extension targets.
let project = Project(name: "App",targets: [Target(name: "App",platform: .iOS,product: .app,bundleId: "io.tuist.App",infoPlist: "Info.plist",sources: ["Sources/**"],dependencies: [.target(name: "NotificationServiceExtension"),.target(name: "WidgetExtension"),// ...]),// ...])