From fc5897778ef3300d693e33eb76898b1e08c880b6 Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 4 Oct 2026 15:22:01 +0300 Subject: [PATCH] improvements --- ios/Podfile | 60 ++++++++++++++++++++--- ios/Runner.xcodeproj/project.pbxproj | 12 ++--- lib/modules/cx_module/chat/chat_page.dart | 17 ++++--- lib/new_views/pages/splash_page.dart | 9 +++- 4 files changed, 75 insertions(+), 23 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index 5596a08a..6d8ed2b0 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '14.0' +platform :ios, '15.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -27,6 +27,50 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe flutter_ios_podfile_setup +# --------------------------------------------------------------------------- +# permission_handler iOS configuration +# +# permission_handler_apple compiles every permission behind a preprocessor +# macro. If a macro is NOT defined, the matching strategy is compiled out and +# the plugin returns PermissionStatus.denied unconditionally - it never asks +# iOS for the real status and never shows a system prompt. +# +# Only the permissions listed here are enabled. Each one MUST have its +# corresponding NS*UsageDescription key in ios/Runner/Info.plist, otherwise +# iOS terminates the app when the permission is requested. +# --------------------------------------------------------------------------- +PERMISSION_HANDLER_MACROS = [ + '$(inherited)', + ## dart: Permission.camera -> NSCameraUsageDescription + 'PERMISSION_CAMERA=1', + ## dart: Permission.microphone -> NSMicrophoneUsageDescription + 'PERMISSION_MICROPHONE=1', + ## dart: Permission.photos -> NSPhotoLibraryUsageDescription + 'PERMISSION_PHOTOS=1', + ## dart: Permission.location / locationAlways / locationWhenInUse + ## -> NSLocationWhenInUseUsageDescription, NSLocationAlwaysUsageDescription + 'PERMISSION_LOCATION=1', + 'PERMISSION_LOCATION_WHENINUSE=1', + 'PERMISSION_LOCATION_ALWAYS=1', + ## dart: Permission.notification + 'PERMISSION_NOTIFICATIONS=1', + ## dart: Permission.speech -> NSSpeechRecognitionUsageDescription + 'PERMISSION_SPEECH_RECOGNIZER=1', +].freeze + +# Merges the permission macros into a build configuration. +# +# Note: a plain `||=` is not safe here - CocoaPods often pre-populates +# GCC_PREPROCESSOR_DEFINITIONS (e.g. 'COCOAPODS=1' for Debug), in which case +# `||=` silently does nothing and the macros are never applied. +def apply_permission_handler_macros(config) + existing = config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] + existing = [existing] if existing.is_a?(String) + existing = ['$(inherited)'] if existing.nil? || existing.empty? + + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = (existing + PERMISSION_HANDLER_MACROS).uniq +end + pod 'FMDB' target 'Runner' do @@ -40,7 +84,11 @@ post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0' + + # permission_handler_apple is built as part of the Pods project, so the + # macros must be applied here for them to have any effect. + apply_permission_handler_macros(config) # Fix for Xcode 15+ DT_TOOLCHAIN_DIR issue if config.base_configuration_reference && File.exist?(config.base_configuration_reference.real_path) @@ -55,12 +103,8 @@ post_install do |installer| installer.generated_projects.each do |project| project.targets.each do |target| target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0' - config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ - '$(inherited)', - ## dart: PermissionGroup.microphone - 'PERMISSION_MICROPHONE=1', - ] + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0' + apply_permission_handler_macros(config) end end end diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 3c09fbf5..e0fcb9d1 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -379,7 +379,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -403,7 +403,7 @@ ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Atoms; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -534,7 +534,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -587,7 +587,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -613,7 +613,7 @@ ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Atoms; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -709,7 +709,7 @@ ENABLE_USER_SCRIPT_SANDBOXING = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = Atoms; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/lib/modules/cx_module/chat/chat_page.dart b/lib/modules/cx_module/chat/chat_page.dart index 1a246add..f45c21e6 100644 --- a/lib/modules/cx_module/chat/chat_page.dart +++ b/lib/modules/cx_module/chat/chat_page.dart @@ -226,16 +226,16 @@ class _ChatPageState extends State { Navigator.pop(context); audioPermission = await Provider.of(context, listen: false).requestAudioPermissions(); if (!audioPermission) { - bool openSetting = await showDialog( + final bool? openSetting = await showDialog( context: context, builder: (_) => const AAlertDialog( title: "Permission denied", content: "Permission is denied. Please go to application Setting to enable it.", - button1Text: "Cancel", - button2Text: "Open Setting", + button1Text: "Open Setting", + button2Text: "Cancel", ), ); - if (!openSetting) PermissionHandler.openAppSettings(); + if (openSetting == true) PermissionHandler.openAppSettings(); return; } else { Navigator.of(context).push(MaterialPageRoute( @@ -270,16 +270,16 @@ class _ChatPageState extends State { Navigator.pop(context); videoPermission = await Provider.of(context, listen: false).requestVideoPermissions(); if (!videoPermission) { - bool openSetting = await showDialog( + final bool? openSetting = await showDialog( context: context, builder: (_) => const AAlertDialog( title: "Permission denied", content: "Permission is denied. Please go to application Setting to enable it.", - button1Text: "Cancel", - button2Text: "Open Setting", + button1Text: "Open Setting", + button2Text: "Cancel", ), ); - if (!openSetting) PermissionHandler.openAppSettings(); + if (openSetting == true) PermissionHandler.openAppSettings(); return; } else { Navigator.of(context).push(MaterialPageRoute( @@ -485,6 +485,7 @@ class _ChatPageState extends State { FocusScope.of(context).unfocus(); File? file = (await showModalBottomSheet( context: context, + backgroundColor: AppColor.bottomSheetColor(context), shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical( top: Radius.circular(20), diff --git a/lib/new_views/pages/splash_page.dart b/lib/new_views/pages/splash_page.dart index 102ea61e..a7d605f5 100644 --- a/lib/new_views/pages/splash_page.dart +++ b/lib/new_views/pages/splash_page.dart @@ -28,7 +28,7 @@ import 'package:test_sa/new_views/swipe_module/dialoge/local_auth_failed_dialog. import 'package:test_sa/new_views/swipe_module/dialoge/single_btn_dialog.dart'; import 'package:test_sa/new_views/swipe_module/swipe_view.dart'; import 'package:test_sa/views/update_available_screen.dart'; - +import 'package:app_badge_control_flutter/app_badge_control_flutter.dart'; import '../../models/size_config.dart'; class SplashPage extends StatefulWidget { @@ -49,6 +49,13 @@ class _SplashPageState extends State { @override void initState() { Firebase.initializeApp(); + AppBadgeControlFlutter.isAppBadgeSupported().then((isSupported) { + if (isSupported) { + AppBadgeControlFlutter.removeBadge(); + } else { + log("AppBadgeControlFlutter: Badge not supported"); + } + }); // NotificationManger.initialisation((notificationDetails) { // // todo @sikander, check notifications payload, because notification model is different to need to check from backend