diff --git a/ios/Podfile b/ios/Podfile index 95b266171d..90a88d6855 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -32,6 +32,10 @@ target 'Runner' do use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + target 'Twake Share' do + inherit! :search_paths + end end post_install do |installer| diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 38be348e90..18c3c8e124 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -11,14 +11,15 @@ 0611A7F22A678C7700F180CC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0611A7F42A678C7700F180CC /* Localizable.strings */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 643D9A430DCE4893FC15438F /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B16AB66899BBD65C9BFB2599 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 81048B2F1319025A0C39525B /* Pods_Twake_Share.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8CAF7CDF8EA1DB709D295C3 /* Pods_Twake_Share.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - AB0F2865DE230DE37373E0E0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */; }; C1005C45261071B5002F4F32 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1005C44261071B5002F4F32 /* ShareViewController.swift */; }; 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, ); }; }; + C1005C4C261071B5002F4F32 /* Twake Share.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C1005C42261071B5002F4F32 /* Twake Share.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; C149567C25C7274F00A16396 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C149567B25C7274F00A16396 /* GoogleService-Info.plist */; }; /* End PBXBuildFile section */ @@ -28,7 +29,7 @@ containerPortal = 97C146E61CF9000F007C117D /* Project object */; proxyType = 1; remoteGlobalIDString = C1005C41261071B5002F4F32; - remoteInfo = "FluffyChat Share"; + remoteInfo = "Twake Share"; }; /* End PBXContainerItemProxy section */ @@ -49,7 +50,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( - C1005C4C261071B5002F4F32 /* FluffyChat Share.appex in Embed App Extensions */, + C1005C4C261071B5002F4F32 /* Twake Share.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -60,11 +61,13 @@ 0611A7F32A678C7700F180CC /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 1B6C59111A74FF0BB750A10A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 216064C73ECC2AECB9F0A1FA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 536699DF3AE0B9D3AF31677B /* Pods-Twake Share.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Twake Share.profile.xcconfig"; path = "Target Support Files/Pods-Twake Share/Pods-Twake Share.profile.xcconfig"; sourceTree = ""; }; + 539142E4CD4E28C397AF0C3B /* Pods-Twake Share.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Twake Share.debug.xcconfig"; path = "Target Support Files/Pods-Twake Share/Pods-Twake Share.debug.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; @@ -73,15 +76,17 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9DB2F3524376810E74C799A8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - C1005C42261071B5002F4F32 /* FluffyChat Share.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "FluffyChat Share.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + B16AB66899BBD65C9BFB2599 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B8CAF7CDF8EA1DB709D295C3 /* Pods_Twake_Share.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Twake_Share.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BA9BBC5546D378D952097E1E /* Pods-Twake Share.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Twake Share.release.xcconfig"; path = "Target Support Files/Pods-Twake Share/Pods-Twake Share.release.xcconfig"; sourceTree = ""; }; + C1005C42261071B5002F4F32 /* Twake Share.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "Twake Share.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; C1005C44261071B5002F4F32 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = ""; }; C1005C47261071B5002F4F32 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; 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 = ""; }; + C1005C53261072D4002F4F32 /* Twake Share.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Twake Share.entitlements"; 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 = ""; }; - EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + FDBA7311CF00074CB7786C33 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -89,7 +94,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AB0F2865DE230DE37373E0E0 /* Pods_Runner.framework in Frameworks */, + 643D9A430DCE4893FC15438F /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -97,16 +102,18 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 81048B2F1319025A0C39525B /* Pods_Twake_Share.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 075EE1BE25359E34308E0B78 /* Frameworks */ = { + 17347C56C756794A41C124FE /* Frameworks */ = { isa = PBXGroup; children = ( - 50DEFC207B70632D9C56ED78 /* Pods_Runner.framework */, + B16AB66899BBD65C9BFB2599 /* Pods_Runner.framework */, + B8CAF7CDF8EA1DB709D295C3 /* Pods_Twake_Share.framework */, ); name = Frameworks; sourceTree = ""; @@ -128,10 +135,10 @@ children = ( 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, - C1005C43261071B5002F4F32 /* FluffyChat Share */, + C1005C43261071B5002F4F32 /* Twake Share */, 97C146EF1CF9000F007C117D /* Products */, E89DCAC000D371640E94E65B /* Pods */, - 075EE1BE25359E34308E0B78 /* Frameworks */, + 17347C56C756794A41C124FE /* Frameworks */, ); sourceTree = ""; }; @@ -139,7 +146,7 @@ isa = PBXGroup; children = ( 97C146EE1CF9000F007C117D /* Runner.app */, - C1005C42261071B5002F4F32 /* FluffyChat Share.appex */, + C1005C42261071B5002F4F32 /* Twake Share.appex */, ); name = Products; sourceTree = ""; @@ -161,23 +168,26 @@ path = Runner; sourceTree = ""; }; - C1005C43261071B5002F4F32 /* FluffyChat Share */ = { + C1005C43261071B5002F4F32 /* Twake Share */ = { isa = PBXGroup; children = ( - C1005C53261072D4002F4F32 /* FluffyChat Share.entitlements */, + C1005C53261072D4002F4F32 /* Twake Share.entitlements */, C1005C44261071B5002F4F32 /* ShareViewController.swift */, C1005C46261071B5002F4F32 /* MainInterface.storyboard */, C1005C49261071B5002F4F32 /* Info.plist */, ); - path = "FluffyChat Share"; + path = "Twake Share"; sourceTree = ""; }; E89DCAC000D371640E94E65B /* Pods */ = { isa = PBXGroup; children = ( - 76737C9A857D5FD6D2634A3F /* Pods-Runner.debug.xcconfig */, - EA246783222E02DD03959891 /* Pods-Runner.release.xcconfig */, - 9DB2F3524376810E74C799A8 /* Pods-Runner.profile.xcconfig */, + 1B6C59111A74FF0BB750A10A /* Pods-Runner.debug.xcconfig */, + FDBA7311CF00074CB7786C33 /* Pods-Runner.release.xcconfig */, + 216064C73ECC2AECB9F0A1FA /* Pods-Runner.profile.xcconfig */, + 539142E4CD4E28C397AF0C3B /* Pods-Twake Share.debug.xcconfig */, + BA9BBC5546D378D952097E1E /* Pods-Twake Share.release.xcconfig */, + 536699DF3AE0B9D3AF31677B /* Pods-Twake Share.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -189,7 +199,7 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 8C9CCA7C5C45651F90C7BFDD /* [CP] Check Pods Manifest.lock */, + 976327FA3CEAB4BFF28CC739 /* [CP] Check Pods Manifest.lock */, C1005C4D261071B5002F4F32 /* Embed App Extensions */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, @@ -197,7 +207,7 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */, + 5F91C032622C7759B233FC58 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -209,10 +219,11 @@ productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; }; - C1005C41261071B5002F4F32 /* FluffyChat Share */ = { + C1005C41261071B5002F4F32 /* Twake Share */ = { isa = PBXNativeTarget; - buildConfigurationList = C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "FluffyChat Share" */; + buildConfigurationList = C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "Twake Share" */; buildPhases = ( + F147DF49C55416DBE4109E8B /* [CP] Check Pods Manifest.lock */, C1005C3E261071B5002F4F32 /* Sources */, C1005C3F261071B5002F4F32 /* Frameworks */, C1005C40261071B5002F4F32 /* Resources */, @@ -221,9 +232,9 @@ ); dependencies = ( ); - name = "FluffyChat Share"; - productName = "FluffyChat Share"; - productReference = C1005C42261071B5002F4F32 /* FluffyChat Share.appex */; + name = "Twake Share"; + productName = "Twake Share"; + productReference = C1005C42261071B5002F4F32 /* Twake Share.appex */; productType = "com.apple.product-type.app-extension"; }; /* End PBXNativeTarget section */ @@ -259,7 +270,7 @@ projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, - C1005C41261071B5002F4F32 /* FluffyChat Share */, + C1005C41261071B5002F4F32 /* Twake Share */, ); }; /* End PBXProject section */ @@ -306,26 +317,21 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 8C9CCA7C5C45651F90C7BFDD /* [CP] Check Pods Manifest.lock */ = { + 5F91C032622C7759B233FC58 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 9740EEB61CF901F6004384FC /* Run Script */ = { @@ -343,21 +349,48 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - F9C8EE392B9AB471149C306E /* [CP] Embed Pods Frameworks */ = { + 976327FA3CEAB4BFF28CC739 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + F147DF49C55416DBE4109E8B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Twake Share-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -385,7 +418,7 @@ /* Begin PBXTargetDependency section */ C1005C4B261071B5002F4F32 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = C1005C41261071B5002F4F32 /* FluffyChat Share */; + target = C1005C41261071B5002F4F32 /* Twake Share */; targetProxy = C1005C4A261071B5002F4F32 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -484,11 +517,11 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29; + CUSTOM_GROUP_ID = group.com.linagora.ios.twake; + DEVELOPMENT_TEAM = KUT463DS29; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -507,7 +540,6 @@ PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.development.profile; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -629,11 +661,11 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29; + CUSTOM_GROUP_ID = group.com.linagora.ios.twake; + DEVELOPMENT_TEAM = KUT463DS29; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -652,7 +684,6 @@ PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.development.profile; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -668,12 +699,11 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CODE_SIGN_IDENTITY = "Apple Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29; + CUSTOM_GROUP_ID = group.com.linagora.ios.twake; + DEVELOPMENT_TEAM = KUT463DS29; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -692,7 +722,6 @@ PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.distribution.profile; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -701,6 +730,7 @@ }; C1005C4E261071B5002F4F32 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 539142E4CD4E28C397AF0C3B /* Pods-Twake Share.debug.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -708,15 +738,14 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements"; + CODE_SIGN_ENTITLEMENTS = "Twake Share/Twake Share.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29; + CUSTOM_GROUP_ID = group.com.linagora.ios.twake; + DEVELOPMENT_TEAM = KUT463DS29; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "FluffyChat Share/Info.plist"; + INFOPLIST_FILE = "Twake Share/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 14.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -729,7 +758,6 @@ PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake.extension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.share.ext.development.profile; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -740,6 +768,7 @@ }; C1005C4F261071B5002F4F32 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = BA9BBC5546D378D952097E1E /* Pods-Twake Share.release.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -747,15 +776,14 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements"; - CODE_SIGN_IDENTITY = "Apple Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_ENTITLEMENTS = "Twake Share/Twake Share.entitlements"; + CODE_SIGN_IDENTITY = "Apple Development"; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29; + CUSTOM_GROUP_ID = group.com.linagora.ios.twake; + DEVELOPMENT_TEAM = KUT463DS29; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "FluffyChat Share/Info.plist"; + INFOPLIST_FILE = "Twake Share/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 14.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -767,7 +795,6 @@ PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake.extension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.share.ext.distribution.profile; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -776,6 +803,7 @@ }; C1005C50261071B5002F4F32 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 536699DF3AE0B9D3AF31677B /* Pods-Twake Share.profile.xcconfig */; buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -783,15 +811,14 @@ CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CODE_SIGN_ENTITLEMENTS = "FluffyChat Share/FluffyChat Share.entitlements"; + CODE_SIGN_ENTITLEMENTS = "Twake Share/Twake Share.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = ""; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = KUT463DS29; + CUSTOM_GROUP_ID = group.com.linagora.ios.twake; + DEVELOPMENT_TEAM = KUT463DS29; GCC_C_LANGUAGE_STANDARD = gnu11; - INFOPLIST_FILE = "FluffyChat Share/Info.plist"; + INFOPLIST_FILE = "Twake Share/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 14.4; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -803,7 +830,6 @@ PRODUCT_BUNDLE_IDENTIFIER = com.linagora.ios.twake.extension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = twake.share.ext.development.profile; SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -833,7 +859,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "FluffyChat Share" */ = { + C1005C51261071B5002F4F32 /* Build configuration list for PBXNativeTarget "Twake Share" */ = { isa = XCConfigurationList; buildConfigurations = ( C1005C4E261071B5002F4F32 /* Debug */, diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index c34a50fe35..6f19754984 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + AppGroupId + $(CUSTOM_GROUP_ID) BGTaskSchedulerPermittedIdentifiers im.fluffychat.app diff --git a/ios/FluffyChat Share/Base.lproj/MainInterface.storyboard b/ios/Twake Share/Base.lproj/MainInterface.storyboard similarity index 100% rename from ios/FluffyChat Share/Base.lproj/MainInterface.storyboard rename to ios/Twake Share/Base.lproj/MainInterface.storyboard diff --git a/ios/FluffyChat Share/Info.plist b/ios/Twake Share/Info.plist similarity index 96% rename from ios/FluffyChat Share/Info.plist rename to ios/Twake Share/Info.plist index 922c4643fc..528bcbc4a3 100644 --- a/ios/FluffyChat Share/Info.plist +++ b/ios/Twake Share/Info.plist @@ -2,6 +2,8 @@ + AppGroupId + $(CUSTOM_GROUP_ID) CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName diff --git a/ios/FluffyChat Share/ShareViewController.swift b/ios/Twake Share/ShareViewController.swift similarity index 77% rename from ios/FluffyChat Share/ShareViewController.swift rename to ios/Twake Share/ShareViewController.swift index e56ab17539..11e5728d23 100644 --- a/ios/FluffyChat Share/ShareViewController.swift +++ b/ios/Twake Share/ShareViewController.swift @@ -5,8 +5,9 @@ import Photos class ShareViewController: SLComposeServiceViewController { // TODO: IMPORTANT: This should be your host app bundle identifier - let hostAppBundleIdentifier = "com.linagora.ios.twake" + var hostAppBundleIdentifier = "com.linagora.ios.twake" let sharedKey = "ShareKey" + var appGroupId = "" var sharedMedia: [SharedMediaFile] = [] var sharedText: [String] = [] let imageContentType = kUTTypeImage as String @@ -15,12 +16,30 @@ class ShareViewController: SLComposeServiceViewController { let urlContentType = kUTTypeURL as String let fileURLType = kUTTypeFileURL as String; + private func loadIds() { + // loading Share extension App Id + let shareExtensionAppBundleIdentifier = Bundle.main.bundleIdentifier!; + + + // convert ShareExtension id to host app id + // By default it is remove last part of id after last point + // For example: com.test.ShareExtension -> com.test + let lastIndexOfPoint = shareExtensionAppBundleIdentifier.lastIndex(of: "."); + hostAppBundleIdentifier = String(shareExtensionAppBundleIdentifier[.. + appGroupId = (Bundle.main.object(forInfoDictionaryKey: "AppGroupId") as? String) ?? "group.\(hostAppBundleIdentifier)"; + } + override func isContentValid() -> Bool { return true } override func viewDidLoad() { super.viewDidLoad(); + + // load group and app id from build info + loadIds(); } override func viewDidAppear(_ animated: Bool) { @@ -64,7 +83,7 @@ class ShareViewController: SLComposeServiceViewController { // If this is the last item, save imagesData in userDefaults and redirect to host app if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") + let userDefaults = UserDefaults(suiteName: this.appGroupId) userDefaults?.set(this.sharedText, forKey: this.sharedKey) userDefaults?.synchronize() this.redirectToHostApp(type: .text) @@ -85,7 +104,7 @@ class ShareViewController: SLComposeServiceViewController { // If this is the last item, save imagesData in userDefaults and redirect to host app if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") + let userDefaults = UserDefaults(suiteName: this.appGroupId) userDefaults?.set(this.sharedText, forKey: this.sharedKey) userDefaults?.synchronize() this.redirectToHostApp(type: .text) @@ -98,30 +117,55 @@ class ShareViewController: SLComposeServiceViewController { } private func handleImages (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { + + func completed(copied: Bool, newPath: URL) { + if(copied) { + sharedMedia.append(SharedMediaFile(path: newPath.absoluteString, thumbnail: nil, duration: nil, type: .image)) + } + + // If this is the last item, save imagesData in userDefaults and redirect to host app + if index == (content.attachments?.count ?? 0) - 1 { + let userDefaults = UserDefaults(suiteName: "group.\(hostAppBundleIdentifier)") + userDefaults?.set(toData(data: sharedMedia), forKey: sharedKey) + userDefaults?.synchronize() + redirectToHostApp(type: .media) + } + } + attachment.loadItem(forTypeIdentifier: imageContentType, options: nil) { [weak self] data, error in - if error == nil, let url = data as? URL, let this = self { - - // Always copy - let fileName = this.getFileName(from: url, type: .image) - let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! - .appendingPathComponent(fileName) - let copied = this.copyFile(at: url, to: newPath) - if(copied) { - this.sharedMedia.append(SharedMediaFile(path: newPath.absoluteString, thumbnail: nil, duration: nil, type: .image)) - } - - // If this is the last item, save imagesData in userDefaults and redirect to host app - if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") - userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) - userDefaults?.synchronize() - this.redirectToHostApp(type: .media) + guard let this = self else { return } + + if error == nil { + + let groupRootURL = FileManager.default + .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! + + if let url = data as? URL { + // Always copy + let fileName = this.getFileName(from: url, type: .image) + let newPath = groupRootURL.appendingPathComponent(fileName) + let copied = this.copyFile(at: url, to: newPath) + completed(copied: copied, newPath: newPath) + } else if let image = data as? UIImage, + let jpegData = image.jpegData(compressionQuality: 1.0) { + + let fileName = "\(Int64(Date().timeIntervalSince1970)).jpg" + let newPath = groupRootURL.appendingPathComponent(fileName) + + var copied = false + do { + try jpegData.write(to: newPath) + copied = true + } catch { + this.dismissWithError() + } + completed(copied: copied, newPath: newPath) + } else { + this.dismissWithError() } - } else { - self?.dismissWithError() + this.dismissWithError() } } } @@ -134,7 +178,7 @@ class ShareViewController: SLComposeServiceViewController { // Always copy let fileName = this.getFileName(from: url, type: .video) let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! + .containerURL(forSecurityApplicationGroupIdentifier: this.appGroupId)! .appendingPathComponent(fileName) let copied = this.copyFile(at: url, to: newPath) if(copied) { @@ -146,7 +190,7 @@ class ShareViewController: SLComposeServiceViewController { // If this is the last item, save imagesData in userDefaults and redirect to host app if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") + let userDefaults = UserDefaults(suiteName: this.appGroupId) userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) userDefaults?.synchronize() this.redirectToHostApp(type: .media) @@ -166,7 +210,7 @@ class ShareViewController: SLComposeServiceViewController { // Always copy let fileName = this.getFileName(from :url, type: .file) let newPath = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(this.hostAppBundleIdentifier)")! + .containerURL(forSecurityApplicationGroupIdentifier: this.appGroupId)! .appendingPathComponent(fileName) let copied = this.copyFile(at: url, to: newPath) if (copied) { @@ -174,7 +218,7 @@ class ShareViewController: SLComposeServiceViewController { } if index == (content.attachments?.count)! - 1 { - let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") + let userDefaults = UserDefaults(suiteName: this.appGroupId) userDefaults?.set(this.toData(data: this.sharedMedia), forKey: this.sharedKey) userDefaults?.synchronize() this.redirectToHostApp(type: .file) @@ -200,6 +244,8 @@ class ShareViewController: SLComposeServiceViewController { } private func redirectToHostApp(type: RedirectType) { + // ids may not loaded yet so we need loadIds here too + loadIds(); let url = URL(string: "ShareMedia-\(hostAppBundleIdentifier)://dataUrl=\(sharedKey)#\(type)") var responder = self as UIResponder? let selectorOpenURL = sel_registerName("openURL:") @@ -291,7 +337,7 @@ class ShareViewController: SLComposeServiceViewController { private func getThumbnailPath(for url: URL) -> URL { let fileName = Data(url.lastPathComponent.utf8).base64EncodedString().replacingOccurrences(of: "==", with: "") let path = FileManager.default - .containerURL(forSecurityApplicationGroupIdentifier: "group.\(hostAppBundleIdentifier)")! + .containerURL(forSecurityApplicationGroupIdentifier: appGroupId)! .appendingPathComponent("\(fileName).jpg") return path } @@ -332,4 +378,4 @@ extension Array { subscript (safe index: UInt) -> Element? { return Int(index) < count ? self[Int(index)] : nil } -} \ No newline at end of file +} diff --git a/ios/FluffyChat Share/FluffyChat Share.entitlements b/ios/Twake Share/Twake Share.entitlements similarity index 100% rename from ios/FluffyChat Share/FluffyChat Share.entitlements rename to ios/Twake Share/Twake Share.entitlements diff --git a/lib/pages/chat_list/chat_list_item_subtitle.dart b/lib/pages/chat_list/chat_list_item_subtitle.dart index fb6ccb330a..826341d138 100644 --- a/lib/pages/chat_list/chat_list_item_subtitle.dart +++ b/lib/pages/chat_list/chat_list_item_subtitle.dart @@ -33,7 +33,7 @@ class ChatListItemSubtitle extends StatelessWidget with ChatListItemMixin { child: typingText.isNotEmpty ? Column( children: [ - Expanded( + Flexible( child: typingTextWidget(typingText, context), ), const Spacer(), diff --git a/scripts/build-ios.sh b/scripts/build-ios.sh index 7fd791b5e0..0444de1533 100755 --- a/scripts/build-ios.sh +++ b/scripts/build-ios.sh @@ -16,7 +16,7 @@ FLUFFYCHAT_ORIG_TEAM="4NXF6Z997G" ### Rotate IDs ### [ -n "${FLUFFYCHAT_NEW_GROUP}" ] && { # App group IDs - sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "ios/FluffyChat Share/FluffyChat Share.entitlements" + sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "ios/Twake Share/Twake Share.entitlements" sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "ios/Runner/Runner.entitlements" sed -i "" "s/group.${FLUFFYCHAT_ORIG_GROUP}.app/group.${FLUFFYCHAT_NEW_GROUP}.app/g" "ios/Runner.xcodeproj/project.pbxproj" # Bundle identifiers