From c3d8fed8a9560b3fa1beb2415d46fb4b889ec234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Ku=C3=9Fowski?= Date: Sun, 31 Aug 2025 09:29:32 +0200 Subject: [PATCH] feat: Add iOS Notification Service Extension for localizable push notifications --- .github/workflows/integrate.yaml | 8 +- ios/Localizable.xcstrings | 32 +++ ios/Notification Service Extension/Info.plist | 13 + ...otification Service Extension.entitlements | 10 + .../NotificationService.swift | 63 +++++ ios/Runner.xcodeproj/project.pbxproj | 229 +++++++++++++++++- scripts/add-firebase-messaging.sh | 2 +- 7 files changed, 349 insertions(+), 8 deletions(-) create mode 100644 ios/Localizable.xcstrings create mode 100644 ios/Notification Service Extension/Info.plist create mode 100644 ios/Notification Service Extension/Notification Service Extension.entitlements create mode 100644 ios/Notification Service Extension/NotificationService.swift diff --git a/.github/workflows/integrate.yaml b/.github/workflows/integrate.yaml index da67d66da..d64662ac4 100644 --- a/.github/workflows/integrate.yaml +++ b/.github/workflows/integrate.yaml @@ -82,7 +82,7 @@ jobs: - run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }} build_debug_ios: - runs-on: macos-latest + runs-on: macos-15 steps: - uses: actions/checkout@v5 - run: cat .github/workflows/versions.env >> $GITHUB_ENV @@ -90,10 +90,8 @@ jobs: with: flutter-version: ${{ env.FLUTTER_VERSION }} cache: true - - name: Setup Xcode version - uses: maxim-lobanov/setup-xcode@v1.6.0 - with: - xcode-version: latest + - name: Use Xcode 16.4 + run: sudo xcode-select --switch /Applications/Xcode_16.4.app - run: brew install sqlcipher - uses: moonrepo/setup-rust@v1 - name: Add Firebase Messaging diff --git a/ios/Localizable.xcstrings b/ios/Localizable.xcstrings new file mode 100644 index 000000000..4f594b190 --- /dev/null +++ b/ios/Localizable.xcstrings @@ -0,0 +1,32 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "%lld unread messages" : { + "comment" : "Default notification title", + "localizations" : { + "en" : { + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unread message" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%lld unread messages" + } + } + } + } + } + } + }, + "New message - open app to read" : { + "comment" : "Default notification body" + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/ios/Notification Service Extension/Info.plist b/ios/Notification Service Extension/Info.plist new file mode 100644 index 000000000..57421ebf9 --- /dev/null +++ b/ios/Notification Service Extension/Info.plist @@ -0,0 +1,13 @@ + + + + + NSExtension + + NSExtensionPointIdentifier + com.apple.usernotifications.service + NSExtensionPrincipalClass + $(PRODUCT_MODULE_NAME).NotificationService + + + diff --git a/ios/Notification Service Extension/Notification Service Extension.entitlements b/ios/Notification Service Extension/Notification Service Extension.entitlements new file mode 100644 index 000000000..932f3e01e --- /dev/null +++ b/ios/Notification Service Extension/Notification Service Extension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.im.fluffychat.app + + + diff --git a/ios/Notification Service Extension/NotificationService.swift b/ios/Notification Service Extension/NotificationService.swift new file mode 100644 index 000000000..9d464e127 --- /dev/null +++ b/ios/Notification Service Extension/NotificationService.swift @@ -0,0 +1,63 @@ +// +// NotificationService.swift +// Notification Extension +// +// Created by Christian Pauly on 26.08.25. +// + +import UserNotifications +import os + +class NotificationService: UNNotificationServiceExtension { + + var contentHandler: ((UNNotificationContent) -> Void)? + var bestAttemptContent: UNMutableNotificationContent? + + override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { + self.contentHandler = contentHandler + bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) + + if let bestAttemptContent = bestAttemptContent { + // Uncomment to read the push message payload: + // os_log("[FluffyChatPushHelper] New message received: %{public}@", log: .default, type: .error, bestAttemptContent.userInfo) + os_log("[FluffyChatPushHelper] New message received") + + guard let roomId = bestAttemptContent.userInfo["room_id"] as? String, + let eventId = bestAttemptContent.userInfo["event_id"] as? String else { + os_log("[FluffyChatPushHelper] Room ID or Event ID is missing!") + let emptyContent = UNMutableNotificationContent() + contentHandler(emptyContent) + return + } + bestAttemptContent.threadIdentifier = roomId + + if + let jsonString = bestAttemptContent.userInfo["counts"] as? String, + let jsonData = jsonString.data(using: .utf8), + let jsonMap = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any], + let unread = jsonMap["unread"] as? Int { + bestAttemptContent.title = String( + localized: "\(unread) unread messages", + comment: "Default notification title" + ) + bestAttemptContent.badge = NSNumber(integerLiteral: unread) + } + + // TODO: Download and decrypt event to display a better body: + bestAttemptContent.body = String( + localized: "New message - open app to read", + comment: "Default notification body" + ) + + contentHandler(bestAttemptContent) + } + } + + override func serviceExtensionTimeWillExpire() { + // Called just before the extension will be terminated by the system. + // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. + if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { + contentHandler(bestAttemptContent) + } + } +} diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a5b6eca36..50745c95c 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -19,6 +19,10 @@ C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C1005C46261071B5002F4F32 /* MainInterface.storyboard */; }; C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; C137635E2AD1446100A8F905 /* notification.caf in Resources */ = {isa = PBXBuildFile; fileRef = C137635D2AD1446100A8F905 /* notification.caf */; }; + C14695592E642D400075F2F7 /* Notification Service Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C14695522E642D400075F2F7 /* Notification Service Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C14695662E642E450075F2F7 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = C14695652E642E450075F2F7 /* Localizable.xcstrings */; }; + C14695672E642E450075F2F7 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = C14695652E642E450075F2F7 /* Localizable.xcstrings */; }; + C14695682E642E450075F2F7 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = C14695652E642E450075F2F7 /* Localizable.xcstrings */; }; C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C149567B25C7274F00A16396 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ @@ -30,6 +34,13 @@ remoteGlobalIDString = C1005C41261071B5002F4F32; remoteInfo = "FluffyChat Share"; }; + C14695572E642D400075F2F7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = C14695512E642D400075F2F7; + remoteInfo = "Notification Service Extension"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -50,6 +61,7 @@ dstSubfolderSpec = 13; files = ( C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */, + C14695592E642D400075F2F7 /* Notification Service Extension.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -81,6 +93,8 @@ C1005C49261071B5002F4F32 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C1005C53261072D4002F4F32 /* FluffyChat Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "FluffyChat Share.entitlements"; sourceTree = ""; }; C137635D2AD1446100A8F905 /* notification.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = notification.caf; sourceTree = ""; }; + C14695522E642D400075F2F7 /* Notification Service Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Notification Service Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + C14695652E642E450075F2F7 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; C149567B25C7274F00A16396 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; C149567D25C7276200A16396 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; C9EB6E6475A19949A37A2634 /* Pods_FluffyChat_Share.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_FluffyChat_Share.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -88,6 +102,27 @@ F3778959E67CDA0CDB0D97BC /* Pods-FluffyChat Share.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-FluffyChat Share.release.xcconfig"; path = "Target Support Files/Pods-FluffyChat Share/Pods-FluffyChat Share.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + C146955D2E642D400075F2F7 /* Exceptions for "Notification Service Extension" folder in "Notification Service Extension" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = C14695512E642D400075F2F7 /* Notification Service Extension */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + C14695532E642D400075F2F7 /* Notification Service Extension */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + C146955D2E642D400075F2F7 /* Exceptions for "Notification Service Extension" folder in "Notification Service Extension" target */, + ); + path = "Notification Service Extension"; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + /* Begin PBXFrameworksBuildPhase section */ 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; @@ -105,6 +140,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C146954F2E642D400075F2F7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -131,9 +173,11 @@ 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( + C14695652E642E450075F2F7 /* Localizable.xcstrings */, 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, C1005C43261071B5002F4F32 /* FluffyChat Share */, + C14695532E642D400075F2F7 /* Notification Service Extension */, 97C146EF1CF9000F007C117D /* Products */, E89DCAC000D371640E94E65B /* Pods */, 075EE1BE25359E34308E0B78 /* Frameworks */, @@ -145,6 +189,7 @@ children = ( 97C146EE1CF9000F007C117D /* Runner.app */, C1005C42261071B5002F4F32 /* FluffyChat Share.appex */, + C14695522E642D400075F2F7 /* Notification Service Extension.appex */, ); name = Products; sourceTree = ""; @@ -213,6 +258,7 @@ ); dependencies = ( C1005C4B261071B5002F4F32 /* PBXTargetDependency */, + C14695582E642D400075F2F7 /* PBXTargetDependency */, ); name = Runner; productName = Runner; @@ -237,13 +283,33 @@ productReference = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; productType = "com.apple.product-type.app-extension"; }; + C14695512E642D400075F2F7 /* Notification Service Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = C146955E2E642D400075F2F7 /* Build configuration list for PBXNativeTarget "Notification Service Extension" */; + buildPhases = ( + C146954E2E642D400075F2F7 /* Sources */, + C146954F2E642D400075F2F7 /* Frameworks */, + C14695502E642D400075F2F7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + C14695532E642D400075F2F7 /* Notification Service Extension */, + ); + name = "Notification Service Extension"; + productName = "Notification Service Extension"; + productReference = C14695522E642D400075F2F7 /* Notification Service Extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1240; + LastSwiftUpdateCheck = 1640; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { @@ -254,10 +320,12 @@ C1005C41261071B5002F4F32 = { CreatedOnToolsVersion = 12.4; }; + C14695512E642D400075F2F7 = { + CreatedOnToolsVersion = 16.4; + }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( @@ -265,12 +333,14 @@ Base, ); mainGroup = 97C146E51CF9000F007C117D; + preferredProjectObjectVersion = 77; productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, C1005C41261071B5002F4F32 /* FluffyChat Share */, + C14695512E642D400075F2F7 /* Notification Service Extension */, ); }; /* End PBXProject section */ @@ -285,6 +355,7 @@ C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */, C137635E2AD1446100A8F905 /* notification.caf in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + C14695672E642E450075F2F7 /* Localizable.xcstrings in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -293,10 +364,19 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + C14695682E642E450075F2F7 /* Localizable.xcstrings in Resources */, C1005C48261071B5002F4F32 /* MainInterface.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; + C14695502E642D400075F2F7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C14695662E642E450075F2F7 /* Localizable.xcstrings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -429,6 +509,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C146954E2E642D400075F2F7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -437,6 +524,11 @@ target = C1005C41261071B5002F4F32 /* FluffyChat Share */; targetProxy = C1005C4A261071B5002F4F32 /* PBXContainerItemProxy */; }; + C14695582E642D400075F2F7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C14695512E642D400075F2F7 /* Notification Service Extension */; + targetProxy = C14695572E642D400075F2F7 /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -512,6 +604,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -604,6 +697,7 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -654,6 +748,7 @@ SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -832,6 +927,126 @@ }; name = Profile; }; + C146955A2E642D400075F2F7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Notification Service Extension/Notification Service Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Notification Service Extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "Notification Service Extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C146955B2E642D400075F2F7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Notification Service Extension/Notification Service Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Notification Service Extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "Notification Service Extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + C146955C2E642D400075F2F7 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Notification Service Extension/Notification Service Extension.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 4NXF6Z997G; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "Notification Service Extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "Notification Service Extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "im.fluffychat.app.Notification-Service-Extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Profile; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -865,6 +1080,16 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C146955E2E642D400075F2F7 /* Build configuration list for PBXNativeTarget "Notification Service Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C146955A2E642D400075F2F7 /* Debug */, + C146955B2E642D400075F2F7 /* Release */, + C146955C2E642D400075F2F7 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; diff --git a/scripts/add-firebase-messaging.sh b/scripts/add-firebase-messaging.sh index af7ce0259..bed5d0751 100755 --- a/scripts/add-firebase-messaging.sh +++ b/scripts/add-firebase-messaging.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -flutter pub add fcm_shared_isolate +flutter pub add fcm_shared_isolate:0.1.0 flutter pub get if [[ "$OSTYPE" == "darwin"* ]]; then