Files
element-x-ios/ElementX/SupportingFiles/target.yml
T
Valere Fedronic fb49f5b83b Add experimental native calls behind a developer flag (#6159)
Add the element-call-ios dependency and a developer option for native calls

The package carries the call UI and the matrix-rust-rtc media stack, pinned by
exact version the way the SDK is, with the local path kept commented out for
working against a checkout. Its media xcframework has no Intel simulator slice
and a package cannot say so for the projects that consume it, hence the
excluded architecture at the project level.

The developer option is off by default and nothing reads it yet. It is placed
next to the Element Call URL override, which only applies to the web view that
native calls replace.
2026-09-17 19:42:18 +03:00

299 lines
10 KiB
YAML

name: ElementX
schemes:
ElementX:
analyze:
config: Debug
archive:
config: Release
build:
targets:
ElementX:
- running
- testing
- profiling
- analyzing
- archiving
profile:
config: Release
run:
config: Debug
environmentVariables:
- variable: HTTPS_PROXY
value: localhost:9090
isEnabled: false
- variable: HTTP_PROXY
value: localhost:9090
isEnabled: false
- variable: UI_TESTS_SCREEN
value: ""
isEnabled: false
- variable: RESET_APP_SETTINGS
value: "true"
isEnabled: false
test:
config: Debug
gatherCoverageData: true
coverageTargets:
- ElementX
testPlans:
- path: ../../UnitTests/SupportingFiles/UnitTests.xctestplan
defaultPlan: true
targets:
ElementX:
type: application
platform: iOS
info:
path: Info.plist
properties:
UILaunchScreen:
UIColorName: colors/background-color
CFBundleDisplayName: $(APP_DISPLAY_NAME)
CFBundleShortVersionString: $(MARKETING_VERSION)
CFBundleVersion: $(CURRENT_PROJECT_VERSION)
CFBundleURLTypes: [
{
CFBundleTypeRole: Editor,
CFBundleURLName: "Application",
CFBundleURLSchemes: [
$(BASE_BUNDLE_IDENTIFIER), # The app's own scheme for custom routes
"matrix" # Matrix URI scheme for permalinks
]
}
]
UIApplicationSceneManifest: {
UIApplicationSupportsMultipleScenes: true
}
UISupportedInterfaceOrientations: [
UIInterfaceOrientationPortrait,
UIInterfaceOrientationPortraitUpsideDown,
UIInterfaceOrientationLandscapeLeft,
UIInterfaceOrientationLandscapeRight
]
appGroupIdentifier: $(APP_GROUP_IDENTIFIER)
baseBundleIdentifier: $(BASE_BUNDLE_IDENTIFIER)
keychainAccessGroupIdentifier: $(KEYCHAIN_ACCESS_GROUP_IDENTIFIER)
classicAppGroupIdentifier: $(CLASSIC_APP_GROUP_IDENTIFIER)
classicAppKeychainServiceIdentifier: $(CLASSIC_APP_KEYCHAIN_SERVICE_IDENTIFIER)
classicAppKeychainAccessGroupIdentifier: $(CLASSIC_APP_KEYCHAIN_ACCESS_GROUP_IDENTIFIER)
classicAppDeepLinkURL: $(CLASSIC_APP_DEEP_LINK_URL)
productionAppName: $(PRODUCTION_APP_NAME)
isNightlyBuild: $(IS_NIGHTLY_BUILD)
ITSAppUsesNonExemptEncryption: false
NSUserActivityTypes: [
INSendMessageIntent,
INStartCallIntent,
]
NSCameraUsageDescription: To take pictures or videos and send them as a message $(APP_DISPLAY_NAME) needs access to the camera.
NSMicrophoneUsageDescription: To record and send messages with audio, $(APP_DISPLAY_NAME) needs to access the microphone.
NSPhotoLibraryAddUsageDescription: This lets you save images and videos to your photo library.
NSLocationWhenInUseUsageDescription: Grant location access so that $(APP_DISPLAY_NAME) can share your location.
NSLocationAlwaysAndWhenInUseUsageDescription: To share your live location, $(APP_DISPLAY_NAME) needs location access when the app is in the background.
NSFaceIDUsageDescription: Face ID is used to access your app.
UIBackgroundModes: [
audio,
fetch,
processing,
voip,
location
]
BGTaskSchedulerPermittedIdentifiers: [
io.element.elementx.background.refresh
]
UTExportedTypeDeclarations:
- UTTypeConformsTo: [public.text]
UTTypeDescription: Mention Pills
UTTypeIdentifier: $(PILLS_UT_TYPE_IDENTIFIER)
CFBundleDocumentTypes:
- CFBundleTypeName: Mention Pills
CFBundleTypeRole: Viewer
LSHandlerRank: Owner
LSItemContentTypes: $(PILLS_UT_TYPE_IDENTIFIER)
LSSupportsOpeningDocumentsInPlace: false
entitlements:
path: ElementX.entitlements
properties:
aps-environment: development
com.apple.developer.associated-domains:
- applinks:element.io
- applinks:app.element.io
- applinks:staging.element.io
- applinks:develop.element.io
- applinks:mobile.element.io
- applinks:matrix.to
# - applinks:localhost?mode=developer # developer mode only works with https (but self-signed is fine).
- webcredentials:*.element.io
com.apple.developer.usernotifications.communication: true
com.apple.security.app-sandbox: true
com.apple.security.application-groups:
- $(APP_GROUP_IDENTIFIER)
- $(CLASSIC_APP_GROUP_IDENTIFIER)
com.apple.security.network.client: true
keychain-access-groups:
- $(KEYCHAIN_ACCESS_GROUP_IDENTIFIER)
- $(CLASSIC_APP_KEYCHAIN_ACCESS_GROUP_IDENTIFIER)
settings:
base:
PRODUCT_NAME: $(APP_NAME)
PRODUCT_BUNDLE_IDENTIFIER: $(BASE_BUNDLE_IDENTIFIER)
MARKETING_VERSION: $(MARKETING_VERSION)
CURRENT_PROJECT_VERSION: $(CURRENT_PROJECT_VERSION)
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
DEVELOPMENT_TEAM: $(DEVELOPMENT_TEAM)
SWIFT_OBJC_BRIDGING_HEADER: ElementX/SupportingFiles/ElementX-Bridging-Header.h
SWIFT_OBJC_INTERFACE_HEADER_NAME: GeneratedInterface-Swift.h
PILLS_UT_TYPE_IDENTIFIER: $(BASE_BUNDLE_IDENTIFIER).pills
DEVELOPMENT_ASSET_PATHS: Components/DevelopmentAssets/Media
SWIFT_VERSION: 6.2
SWIFT_APPROACHABLE_CONCURRENCY: YES
SWIFT_DEFAULT_ACTOR_ISOLATION: MainActor
OTHER_SWIFT_FLAGS:
- "-DIS_MAIN_APP"
preBuildScripts:
- name: 🛠 SwiftGen
runOnlyWhenInstalling: false
basedOnDependencyAnalysis: false
shell: /bin/sh
script: |
export PATH="$PATH:/opt/homebrew/bin"
if which swiftgen >/dev/null; then
swiftgen config run --config Tools/SwiftGen/swiftgen-config.yml
else
echo "warning: SwiftGen not installed, download from https://github.com/SwiftGen/SwiftGen"
fi
- name: 🧙 Sourcery - Generate mocks
runOnlyWhenInstalling: false
basedOnDependencyAnalysis: false
shell: /bin/sh
script: |
export PATH="$PATH:/opt/homebrew/bin"
if which sourcery >/dev/null; then
sourcery --config Tools/Sourcery/AutoMockableConfig.yml
else
echo "warning: Sourcery not installed, run swift run tools setup-project"
fi
- name: 🧙 Sourcery - Generate preview tests
runOnlyWhenInstalling: false
basedOnDependencyAnalysis: false
shell: /bin/sh
script: |
export PATH="$PATH:/opt/homebrew/bin"
if which sourcery >/dev/null; then
sourcery --config Tools/Sourcery/PreviewTestsConfig.yml
else
echo "warning: Sourcery not installed, run swift run tools setup-project"
fi
- name: 🧙 Sourcery - Generate Accessibility Tests
runOnlyWhenInstalling: false
basedOnDependencyAnalysis: false
shell: /bin/sh
script: |
export PATH="$PATH:/opt/homebrew/bin"
if which sourcery >/dev/null; then
sourcery --config Tools/Sourcery/TestablePreviewsDictionary.yml
sourcery --config Tools/Sourcery/AccessibilityTests.yml
else
echo "warning: Sourcery not installed, run swift run tools setup-project"
fi
postBuildScripts:
- name: ⚠️ SwiftLint
runOnlyWhenInstalling: false
basedOnDependencyAnalysis: false
shell: /bin/sh
script: |
export PATH="$PATH:/opt/homebrew/bin"
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
- name: 🧹 SwiftFormat
runOnlyWhenInstalling: false
basedOnDependencyAnalysis: false
shell: /bin/sh
script: |
export PATH="$PATH:/opt/homebrew/bin"
if which swiftformat >/dev/null; then
swiftformat --lint --lenient "$PROJECT_DIR"
else
echo "warning: SwiftFormat not installed, download from https://github.com/nicklockwood/SwiftFormat"
fi
dependencies:
- target: NSE
- target: ShareExtension
- target: MatrixRustSDKMocks
- package: MatrixRustSDK
embed: true
- package: Compound
- package: BuildExtensions
product: Macros
- package: Algorithms
- package: AsyncAlgorithms
- package: AnalyticsEvents
- package: Collections
- package: DeviceKit
- package: EmbeddedElementCall
- package: KeychainAccess
- package: Kingfisher
- package: KZFileWatchers
- package: LoremSwiftum
- package: LRUCache
- package: Mantis
- target: MapLibreInterface
embed: true
# Embedded but not linked, dlopen'd on first map use
- target: MapLibreShim
link: false
embed: true
# The app just embeds the framework so it's in the bundle for the shim's load
# command to resolve against.
- framework: ../../MapLibre.framework
implicit: true
link: false
embed: true
- package: ElementCall
product: ElementCall
- package: PostHog
- package: SwiftState
- package: GZIP
- package: Sentry
products:
- Sentry
- SentrySwiftUI
- package: Version
- package: Emojibase
- package: WysiwygComposer
- package: SwiftOGG
- package: SwiftSoup
- package: SwiftFlow
product: Flow
- package: DSWaveformImage
product: DSWaveformImageViews
sources:
- path: ../Sources
excludes:
- Other/Extensions/XCTestCase.swift
- Other/Extensions/XCUIElement.swift
- path: ../../Components/Secrets/Secrets.swift
- path: ../Resources
- path: ../SupportingFiles
- path: ../../Tools/Scripts/Templates/SimpleScreenExample/ElementX
- path: ../../Components/DevelopmentAssets/Media
# This is required for testing purposes... The problem with unit tests is that if you
# try to `@testable import NSE` you can only get the definition of files, but due to a
# limitation in how they work, they can only compile files that are part of the main test
# target, so linking will fail. The solution is to just have the main app to reference the
# extension code, and test it directly.
- path: ../../NSE/Sources