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:  ), ])
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.
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"), // … ] ), // … ])