diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 4ebd5c641..ed3a5b2e1 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 56; objects = { /* Begin PBXBuildFile section */ @@ -889,7 +889,7 @@ 127C8472672A5BA09EF1ACF8 /* CurrentValuePublisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentValuePublisher.swift; sourceTree = ""; }; 12EDAFB64FA5F6812D54F39A /* MigrationScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationScreenViewModel.swift; sourceTree = ""; }; 12F1E7F9C2BE8BB751037826 /* WaitlistScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistScreenCoordinator.swift; sourceTree = ""; }; - 1304D9191300873EADA52D6E /* IntegrationTests.xctestplan */ = {isa = PBXFileReference; path = IntegrationTests.xctestplan; sourceTree = ""; }; + 1304D9191300873EADA52D6E /* IntegrationTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = IntegrationTests.xctestplan; sourceTree = ""; }; 130ED565A078F7E0B59D9D25 /* UNTextInputNotificationResponse+Creator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UNTextInputNotificationResponse+Creator.swift"; sourceTree = ""; }; 13802897C7AFA360EA74C0B0 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; 1423AB065857FA546444DB15 /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; @@ -1035,7 +1035,7 @@ 47111410B6E659A697D472B5 /* RoomProxyProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomProxyProtocol.swift; sourceTree = ""; }; 471EB7D96AFEA8D787659686 /* EmoteRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmoteRoomTimelineView.swift; sourceTree = ""; }; 47873756E45B46683D97DC32 /* LegalInformationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LegalInformationScreenModels.swift; sourceTree = ""; }; - 478BE8591BD13E908EF70C0C /* DesignKit */ = {isa = PBXFileReference; lastKnownFileType = folder; name = DesignKit; path = DesignKit; sourceTree = SOURCE_ROOT; }; + 478BE8591BD13E908EF70C0C /* DesignKit */ = {isa = PBXFileReference; lastKnownFileType = folder; path = DesignKit; sourceTree = SOURCE_ROOT; }; 4798B3B7A1E8AE3901CEE8C6 /* FramePreferenceKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FramePreferenceKey.swift; sourceTree = ""; }; 47EBB5D698CE9A25BB553A2D /* Strings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = ""; }; 47F29139BC2A804CE5E0757E /* MediaUploadPreviewScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaUploadPreviewScreenViewModel.swift; sourceTree = ""; }; @@ -1049,7 +1049,7 @@ 4B41FABA2B0AEF4389986495 /* LoginMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginMode.swift; sourceTree = ""; }; 4B5046BB295AEAFA6FB81655 /* SessionVerificationScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationScreenModels.swift; sourceTree = ""; }; 4BD371B60E07A5324B9507EF /* AnalyticsSettingsScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnalyticsSettingsScreenCoordinator.swift; sourceTree = ""; }; - 4CD6AC7546E8D7E5C73CEA48 /* ElementX.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = ElementX.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CD6AC7546E8D7E5C73CEA48 /* ElementX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ElementX.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4CDDDDD9FE1A699D23A5E096 /* LoginScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginScreen.swift; sourceTree = ""; }; 4D6E4C37E9F0E53D3DF951AC /* HomeScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenUITests.swift; sourceTree = ""; }; 4E2245243369B99216C7D84E /* ImageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageCache.swift; sourceTree = ""; }; @@ -1222,7 +1222,7 @@ 8D55702474F279D910D2D162 /* RoomStateEventStringBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomStateEventStringBuilder.swift; sourceTree = ""; }; 8D8169443E5AC5FF71BFB3DB /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; 8DC2C9E0E15C79BBDA80F0A2 /* TimelineStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineStyle.swift; sourceTree = ""; }; - 8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; path = UITests.xctestplan; sourceTree = ""; }; + 8E088F2A1B9EC529D3221931 /* UITests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UITests.xctestplan; sourceTree = ""; }; 8E1BBA73B611EDEEA6E20E05 /* InvitesScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitesScreenModels.swift; sourceTree = ""; }; 8EC57A32ABC80D774CC663DB /* SettingsScreenUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsScreenUITests.swift; sourceTree = ""; }; 8F21ED7205048668BEB44A38 /* AppActivityView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppActivityView.swift; sourceTree = ""; }; @@ -1333,7 +1333,7 @@ B4CFE236419E830E8946639C /* Analytics+SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Analytics+SwiftUI.swift"; sourceTree = ""; }; B590BD4507D4F0A377FDE01A /* LoadableAvatarImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadableAvatarImage.swift; sourceTree = ""; }; B5B243E7818E5E9F6A4EDC7A /* NoticeRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeRoomTimelineView.swift; sourceTree = ""; }; - B61C339A2FDDBD067FF6635C /* ConfettiScene.scn */ = {isa = PBXFileReference; path = ConfettiScene.scn; sourceTree = ""; }; + B61C339A2FDDBD067FF6635C /* ConfettiScene.scn */ = {isa = PBXFileReference; lastKnownFileType = file.bplist; path = ConfettiScene.scn; sourceTree = ""; }; B6311F21F911E23BE4DF51B4 /* ReadMarkerRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadMarkerRoomTimelineView.swift; sourceTree = ""; }; B697816AF93DA06EC58C5D70 /* WaitlistScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WaitlistScreenViewModelProtocol.swift; sourceTree = ""; }; B6E89E530A8E92EC44301CA1 /* Bundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; @@ -1420,7 +1420,7 @@ CD95B3714F806AC9CF9A557B /* ComposerToolbarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerToolbarViewModel.swift; sourceTree = ""; }; CDB3227C7A74B734924942E9 /* RoomSummaryProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSummaryProvider.swift; sourceTree = ""; }; CEE0E6043EFCF6FD2A341861 /* TimelineReplyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineReplyView.swift; sourceTree = ""; }; - CEE41494C837AA403A06A5D9 /* UnitTests.xctestplan */ = {isa = PBXFileReference; path = UnitTests.xctestplan; sourceTree = ""; }; + CEE41494C837AA403A06A5D9 /* UnitTests.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = UnitTests.xctestplan; sourceTree = ""; }; CF48AF076424DBC1615C74AD /* AuthenticationServiceProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationServiceProxy.swift; sourceTree = ""; }; D0140615D2232612C813FD6C /* EncryptedHistoryRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EncryptedHistoryRoomTimelineItem.swift; sourceTree = ""; }; D071F86CD47582B9196C9D16 /* UserDiscoverySection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDiscoverySection.swift; sourceTree = ""; }; @@ -1499,7 +1499,7 @@ ECF79FB25E2D4BD6F50CE7C9 /* RoomMembersListScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersListScreenViewModel.swift; sourceTree = ""; }; ED044D00F2176681CC02CD54 /* HomeScreenRoomCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeScreenRoomCell.swift; sourceTree = ""; }; ED1D792EB82506A19A72C8DE /* RoomTimelineItemProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomTimelineItemProtocol.swift; sourceTree = ""; }; - ED482057AE39D5C6D9C5F3D8 /* message.caf */ = {isa = PBXFileReference; path = message.caf; sourceTree = ""; }; + ED482057AE39D5C6D9C5F3D8 /* message.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = message.caf; sourceTree = ""; }; ED983D4DCA5AFA6E1ED96099 /* StateRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateRoomTimelineView.swift; sourceTree = ""; }; EDAA4472821985BF868CC21C /* ServerSelectionViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerSelectionViewModelTests.swift; sourceTree = ""; }; EE378083653EF0C9B5E9D580 /* EmoteRoomTimelineItemContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmoteRoomTimelineItemContent.swift; sourceTree = ""; }; @@ -1513,7 +1513,7 @@ F174A5627CDB3CAF280D1880 /* EmojiPickerScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerScreenModels.swift; sourceTree = ""; }; F17EFA1D3D09FC2F9C5E1CB2 /* MediaProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaProvider.swift; sourceTree = ""; }; F1B8500C152BC59445647DA8 /* UnsupportedRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsupportedRoomTimelineItem.swift; sourceTree = ""; }; - F2D513D2477B57F90E98EEC0 /* portrait_test_video.mp4 */ = {isa = PBXFileReference; path = portrait_test_video.mp4; sourceTree = ""; }; + F2D513D2477B57F90E98EEC0 /* portrait_test_video.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = portrait_test_video.mp4; sourceTree = ""; }; F31F59030205A6F65B057E1A /* MatrixEntityRegexTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MatrixEntityRegexTests.swift; sourceTree = ""; }; F348B5F2C12F9D4F4B4D3884 /* VideoRoomTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoRoomTimelineItem.swift; sourceTree = ""; }; F36C0A6D59717193F49EA986 /* UserSessionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSessionTests.swift; sourceTree = ""; }; diff --git a/ElementX/Sources/Application/AppCoordinator.swift b/ElementX/Sources/Application/AppCoordinator.swift index f3982bc1d..64ebe8e50 100644 --- a/ElementX/Sources/Application/AppCoordinator.swift +++ b/ElementX/Sources/Application/AppCoordinator.swift @@ -58,7 +58,14 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationCoordinatorDelegate, init() { let appSettings = AppSettings() - MXLog.configure(logLevel: appSettings.logLevel) + + if appSettings.otlpTracingEnabled { + MXLog.configure(logLevel: appSettings.logLevel, otlpConfiguration: .init(url: appSettings.otlpTracingURL, + username: appSettings.otlpTracingUsername, + password: appSettings.otlpTracingPassword)) + } else { + MXLog.configure(logLevel: appSettings.logLevel) + } if ProcessInfo.processInfo.environment["RESET_APP_SETTINGS"].map(Bool.init) == true { AppSettings.reset() diff --git a/ElementX/Sources/Application/AppSettings.swift b/ElementX/Sources/Application/AppSettings.swift index b6797ef2e..63ccaec54 100644 --- a/ElementX/Sources/Application/AppSettings.swift +++ b/ElementX/Sources/Application/AppSettings.swift @@ -30,6 +30,7 @@ final class AppSettings { case enableInAppNotifications case pusherProfileTag case logLevel + case otlpTracingEnabled // Feature flags case shouldCollapseRoomStateEvents @@ -197,9 +198,18 @@ final class AppSettings { let permalinkBaseURL: URL = "https://matrix.to" + // MARK: - Logging + @UserPreference(key: UserDefaultsKeys.logLevel, defaultValue: TracingConfiguration.LogLevel.info, storageType: .userDefaults(store)) var logLevel + @UserPreference(key: UserDefaultsKeys.otlpTracingEnabled, defaultValue: false, storageType: .userDefaults(store)) + var otlpTracingEnabled + + let otlpTracingURL = InfoPlistReader.main.otlpTracingURL + let otlpTracingUsername = InfoPlistReader.main.otlpTracingUsername + let otlpTracingPassword = InfoPlistReader.main.otlpTracingPassword + // MARK: - Maps // maptiler base url diff --git a/ElementX/Sources/Other/InfoPlistReader.swift b/ElementX/Sources/Other/InfoPlistReader.swift index a580cd796..fcdb99804 100644 --- a/ElementX/Sources/Other/InfoPlistReader.swift +++ b/ElementX/Sources/Other/InfoPlistReader.swift @@ -27,6 +27,10 @@ struct InfoPlistReader { static let utExportedTypeDeclarationsKey = "UTExportedTypeDeclarations" static let utTypeIdentifierKey = "UTTypeIdentifier" static let utDescriptionKey = "UTTypeDescription" + + static let otlpTracingURL = "otlpTracingURL" + static let otlpTracingUsername = "otlpTracingUsername" + static let otlpTracingPassword = "otlpTracingPassword" } private enum Values { @@ -87,10 +91,27 @@ struct InfoPlistReader { infoPlistValue(forKey: Keys.bundleDisplayName) } - /// Map Libre API Key + // MARK: - MapLibre + var mapLibreAPIKey: String { infoPlistValue(forKey: Keys.mapLibreAPIKey) } + + // MARK: - OTLP Tracing + + var otlpTracingURL: String { + infoPlistValue(forKey: Keys.otlpTracingURL) + } + + var otlpTracingUsername: String { + infoPlistValue(forKey: Keys.otlpTracingUsername) + } + + var otlpTracingPassword: String { + infoPlistValue(forKey: Keys.otlpTracingPassword) + } + + // MARK: - Mention Pills /// Mention Pills UTType var pillsUTType: String { @@ -101,6 +122,8 @@ struct InfoPlistReader { } return utType } + + // MARK: - Private private func infoPlistValue(forKey key: String) -> T { guard let result = bundle.object(forInfoDictionaryKey: key) as? T else { diff --git a/ElementX/Sources/Other/Logging/MXLog.swift b/ElementX/Sources/Other/Logging/MXLog.swift index 1d1a1ab75..96178dda0 100644 --- a/ElementX/Sources/Other/Logging/MXLog.swift +++ b/ElementX/Sources/Other/Logging/MXLog.swift @@ -43,6 +43,7 @@ enum MXLog { static func configure(target: String? = nil, logLevel: TracingConfiguration.LogLevel, + otlpConfiguration: OTLPConfiguration? = nil, redirectToFiles: Bool = Constants.redirectToFiles, maxLogFileCount: UInt = Constants.maxLogFileCount, logFileSizeLimit: UInt = Constants.logFilesSizeLimit) { @@ -58,7 +59,7 @@ enum MXLog { return } - setupTracing(configuration: .custom(logLevel: logLevel)) + setupTracing(configuration: .custom(logLevel: logLevel), otlpConfiguration: otlpConfiguration) if let target { self.target = target diff --git a/ElementX/Sources/Other/Logging/RustTracing.swift b/ElementX/Sources/Other/Logging/RustTracing.swift index cc6c36166..e7f7edba5 100644 --- a/ElementX/Sources/Other/Logging/RustTracing.swift +++ b/ElementX/Sources/Other/Logging/RustTracing.swift @@ -17,6 +17,12 @@ import Collections import MatrixRustSDK +struct OTLPConfiguration { + let url: String + let username: String + let password: String +} + // This exposes the full Rust side tracing subscriber filter for more flexibility. // We can filter by level, crate and even file. See more details here: // https://docs.rs/tracing-subscriber/0.2.7/tracing_subscriber/filter/struct.EnvFilter.html#examples @@ -83,6 +89,18 @@ struct TracingConfiguration { } } -func setupTracing(configuration: TracingConfiguration) { - setupTracing(config: .init(filter: configuration.filter, writeToStdoutOrSystem: true, writeToFiles: nil)) +func setupTracing(configuration: TracingConfiguration, otlpConfiguration: OTLPConfiguration?) { + if let otlpConfiguration { + setupOtlpTracing(config: .init(clientName: "ElementX-iOS", + user: otlpConfiguration.username, + password: otlpConfiguration.password, + otlpEndpoint: otlpConfiguration.url, + filter: configuration.filter, + writeToStdoutOrSystem: true, + writeToFiles: nil)) + } else { + setupTracing(config: .init(filter: configuration.filter, + writeToStdoutOrSystem: true, + writeToFiles: nil)) + } } diff --git a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift index e5853d1c6..1a623fae4 100644 --- a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift +++ b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/DeveloperOptionsScreenModels.swift @@ -44,6 +44,7 @@ enum DeveloperOptionsScreenViewAction { protocol DeveloperOptionsProtocol: AnyObject { var logLevel: TracingConfiguration.LogLevel { get set } + var otlpTracingEnabled: Bool { get set } var shouldCollapseRoomStateEvents: Bool { get set } var userSuggestionsEnabled: Bool { get set } var readReceiptsEnabled: Bool { get set } diff --git a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift index 80d20877d..3f91ed6e2 100644 --- a/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift +++ b/ElementX/Sources/Screens/Settings/DeveloperOptionsScreen/View/DeveloperOptionsScreen.swift @@ -22,13 +22,20 @@ struct DeveloperOptionsScreen: View { var body: some View { Form { - Picker(selection: $context.logLevel) { - ForEach(TracingConfiguration.LogLevel.allCases, id: \.self) { logLevel in - Text(logLevel.rawValue.capitalized) + Section("Logging") { + Picker(selection: $context.logLevel) { + ForEach(TracingConfiguration.LogLevel.allCases, id: \.self) { logLevel in + Text(logLevel.rawValue.capitalized) + } + } label: { + Text("Log level") + Text("Requires app reboot") + } + + Toggle(isOn: $context.otlpTracingEnabled) { + Text("OTLP tracing") + Text("Requires app reboot") } - } label: { - Text("Log level") - Text("Requires app reboot") } Section("Timeline") { diff --git a/ElementX/SupportingFiles/Info.plist b/ElementX/SupportingFiles/Info.plist index e429bdb7f..9af4795e3 100644 --- a/ElementX/SupportingFiles/Info.plist +++ b/ElementX/SupportingFiles/Info.plist @@ -90,5 +90,11 @@ $(KEYCHAIN_ACCESS_GROUP_IDENTIFIER) mapLibreAPIKey $(MAPLIBRE_API_KEY) + otlpTracingPassword + ${OTLP_TRACING_PASSWORD} + otlpTracingURL + ${OTLP_TRACING_URL} + otlpTracingUsername + ${OTLP_TRACING_USERNAME} diff --git a/ElementX/SupportingFiles/secrets.xcconfig b/ElementX/SupportingFiles/secrets.xcconfig index 5eb6c8137..b292d5e69 100644 --- a/ElementX/SupportingFiles/secrets.xcconfig +++ b/ElementX/SupportingFiles/secrets.xcconfig @@ -17,4 +17,16 @@ // Configuration settings file format documentation can be found at: // https://help.apple.com/xcode/#/dev745c5c974 +// MARK: - MapLibre MAPLIBRE_API_KEY = your_key + +// MARK: - OTLP Tracing + +// URLs need special treatment to work properly in xcconfig files +// https://stackoverflow.com/a/36297483/730924 +// i.e. make sure to use https:/$()/ in the scheme in the stored secret +OTLP_TRACING_URL = otlp_endpoint + +OTLP_TRACING_USERNAME = otlp_username +OTLP_TRACING_PASSWORD = otlp_password + diff --git a/ElementX/SupportingFiles/target.yml b/ElementX/SupportingFiles/target.yml index c5f1ee9ff..6fcd5528f 100644 --- a/ElementX/SupportingFiles/target.yml +++ b/ElementX/SupportingFiles/target.yml @@ -80,7 +80,6 @@ targets: BGTaskSchedulerPermittedIdentifiers: [ io.element.elementx.background.refresh ] - mapLibreAPIKey: $(MAPLIBRE_API_KEY) UTExportedTypeDeclarations: - UTTypeConformsTo: [public.text] UTTypeDescription: Mention Pills @@ -91,6 +90,10 @@ targets: LSHandlerRank: Owner LSItemContentTypes: $(PILLS_UT_TYPE_IDENTIFIER) LSSupportsOpeningDocumentsInPlace: false + mapLibreAPIKey: $(MAPLIBRE_API_KEY) + otlpTracingURL: ${OTLP_TRACING_URL} + otlpTracingUsername: ${OTLP_TRACING_USERNAME} + otlpTracingPassword: ${OTLP_TRACING_PASSWORD} settings: diff --git a/fastlane/Fastfile b/fastlane/Fastfile index a10081e7a..76da99a60 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -164,7 +164,7 @@ lane :config_nightly do data["settings"]["BASE_APP_GROUP_IDENTIFIER"] = "io.element.nightly" data["settings"]["BASE_BUNDLE_IDENTIFIER"] = "io.element.elementx.nightly" - config_maplibre() + config_secrets() File.open(target_file_path, 'w') { |f| YAML.dump(data, f) } @@ -180,7 +180,7 @@ lane :config_nightly do end lane :config_production do - config_maplibre() + config_secrets() xcodegen(spec: "project.yml") end @@ -414,13 +414,43 @@ private_lane :create_simulator_if_necessary do |options| end end -private_lane :config_maplibre do - api_key = ENV["MAPLIBRE_API_KEY"] - UI.user_error!("Invalid Map Libre API key.") unless !api_key.to_s.empty? +private_lane :config_secrets do + maplibre_api_key = ENV["MAPLIBRE_API_KEY"] + UI.user_error!("Invalid Map Libre API key.") unless !maplibre_api_key.to_s.empty? + + otlp_tracing_url = ENV["OTLP_TRACING_URL"] + UI.user_error!("Invalid OTLP tracing URL.") unless !otlp_tracing_url.to_s.empty? + + otlp_tracing_username = ENV["OTLP_TRACING_USERNAME"] + UI.user_error!("Invalid OTLP tracing username.") unless !otlp_tracing_username.to_s.empty? + + otlp_tracing_password = ENV["OTLP_TRACING_PASSWORD"] + UI.user_error!("Invalid OTLP tracing URL.") unless !otlp_tracing_password.to_s.empty? set_xcconfig_value( path: './ElementX/SupportingFiles/secrets.xcconfig', name: 'MAPLIBRE_API_KEY', - value: api_key + value: maplibre_api_key + ) + + # URLs need special treatment to work properly in xcconfig files + # https://stackoverflow.com/a/36297483/730924 + # i.e. make sure to use https:/$()/ in the scheme in the stored secret + set_xcconfig_value( + path: './ElementX/SupportingFiles/secrets.xcconfig', + name: 'OTLP_TRACING_URL', + value: otlp_tracing_url + ) + + set_xcconfig_value( + path: './ElementX/SupportingFiles/secrets.xcconfig', + name: 'OTLP_TRACING_USERNAME', + value: otlp_tracing_username + ) + + set_xcconfig_value( + path: './ElementX/SupportingFiles/secrets.xcconfig', + name: 'OTLP_TRACING_PASSWORD', + value: otlp_tracing_password ) end