diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c7c4c6a..bf26010 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -106,7 +106,7 @@ - + diff --git a/lib/main.dart b/lib/main.dart index f1da55e..9aec6c2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,8 +3,6 @@ import 'dart:async'; import 'dart:io'; -import 'package:android_intent_plus/android_intent.dart'; -import 'package:app_links/app_links.dart'; import 'package:bot_toast/bot_toast.dart'; import 'package:didvan/config/theme_data.dart'; import 'package:didvan/firebase_options.dart'; @@ -35,18 +33,19 @@ import 'package:provider/provider.dart'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; +// پکیج جدید برای Deep Linking +import 'package:app_links/app_links.dart'; + final GlobalKey navigatorKey = GlobalKey(); +// متغیر استاتیک برای نگهداری لینک اولیه +Uri? initialURI; + @pragma('vm:entry-point') Future _backgroundCallbackHomeWidget(Uri? uri) async { - await HomeWidget.saveWidgetData("uri", uri!.host); - AndroidIntent intent = const AndroidIntent( - action: 'android.intent.action.RUN', - package: 'com.didvan.didvanapp', - componentName: 'com.didvan.didvanapp.MainActivity', - ); - await intent.launch(); - return; + if (uri != null) { + await HomeWidget.saveWidgetData("uri", uri.host); + } } void main() async { @@ -59,10 +58,8 @@ void main() async { try { if (Platform.isAndroid) { await FlutterDownloader.initialize( - debug: - true, - ignoreSsl: - true + debug: true, + ignoreSsl: true ); } } catch (e) { @@ -74,7 +71,7 @@ void main() async { options: DefaultFirebaseOptions.currentPlatform); await FirebaseApi().initNotification(); } catch (e) { - debugPrint; + debugPrint(e.toString()); } await SentryFlutter.init( @@ -98,38 +95,33 @@ class Didvan extends StatefulWidget { class _DidvanState extends State with WidgetsBindingObserver { late AppLinks _appLinks; StreamSubscription? _linkSubscription; - @override - void didChangeDependencies() { - super.didChangeDependencies(); - } @override void initState() { - WidgetsBinding.instance.addObserver(this); super.initState(); + WidgetsBinding.instance.addObserver(this); + // مقداردهی اولیه و گوش دادن به لینک‌ها در اینجا انجام می‌شود _initDeepLinks(); } - + @override void dispose() { WidgetsBinding.instance.removeObserver(this); - _linkSubscription?.cancel(); + _linkSubscription?.cancel(); // لغو کردن subscription if (MediaService.currentPodcast != null) { MediaService.audioPlayer.dispose(); } super.dispose(); } - + + /// منطق جدید برای مدیریت لینک‌ها با app_links Future _initDeepLinks() async { _appLinks = AppLinks(); - // بررسی لینک اولیه در زمان باز شدن اپلیکیشن - final initialUri = await _appLinks.getInitialLink(); - if (initialUri != null) { - _navigateTo(initialUri); - } + // لینک اولیه را فقط در متغیر ذخیره می‌کنیم + initialURI = await _appLinks.getInitialLink(); - // گوش دادن به لینک‌های جدید زمانی که اپلیکیشن در حال اجراست + // به لینک‌های جدید زمانی که اپلیکیشن باز است گوش می‌دهیم _linkSubscription = _appLinks.uriLinkStream.listen((uri) { _navigateTo(uri); }); @@ -146,9 +138,6 @@ class _DidvanState extends State with WidgetsBindingObserver { } } - - bool b = true; - @override void didChangeAppLifecycleState(AppLifecycleState state) async { if (!kIsWeb) { @@ -171,33 +160,15 @@ class _DidvanState extends State with WidgetsBindingObserver { Widget build(BuildContext context) { return MultiProvider( providers: [ - ChangeNotifierProvider( - create: (context) => PodcastsState(), - ), - ChangeNotifierProvider( - create: (context) => MediaProvider(), - ), - ChangeNotifierProvider( - create: (context) => UserProvider(), - ), - ChangeNotifierProvider( - create: (context) => ThemeProvider(), - ), - ChangeNotifierProvider( - create: (context) => StudioDetailsState(), - ), - ChangeNotifierProvider( - create: (context) => HistoryAiChatState(), - ), - ChangeNotifierProvider( - create: (context) => AiState(), - ), - ChangeNotifierProvider( - create: (context) => AiChatState(), - ), - ChangeNotifierProvider( - create: (context) => BotAssistantsState(), - ), + ChangeNotifierProvider(create: (context) => PodcastsState()), + ChangeNotifierProvider(create: (context) => MediaProvider()), + ChangeNotifierProvider(create: (context) => UserProvider()), + ChangeNotifierProvider(create: (context) => ThemeProvider()), + ChangeNotifierProvider(create: (context) => StudioDetailsState()), + ChangeNotifierProvider(create: (context) => HistoryAiChatState()), + ChangeNotifierProvider(create: (context) => AiState()), + ChangeNotifierProvider(create: (context) => AiChatState()), + ChangeNotifierProvider(create: (context) => BotAssistantsState()), ], child: Consumer( builder: (context, themeProvider, child) => Container( @@ -243,4 +214,4 @@ class _DidvanState extends State with WidgetsBindingObserver { ), ); } -} \ No newline at end of file +} diff --git a/lib/views/splash/splash.dart b/lib/views/splash/splash.dart index d7eedb1..d6e7aa8 100644 --- a/lib/views/splash/splash.dart +++ b/lib/views/splash/splash.dart @@ -1,5 +1,3 @@ -// ignore_for_file: deprecated_member_use - import 'package:didvan/config/design_config.dart'; import 'package:didvan/constants/assets.dart'; import 'package:didvan/main.dart'; @@ -89,9 +87,6 @@ class _SplashState extends State { Future _initialize(ThemeProvider themeProvider, UserProvider userProvider, MediaProvider mediaProvider) async { try { - // if (!kIsWeb) { - // await AppInitializer.onCheckUpdate(context); - // } if (kIsWeb) { html.window.onBeforeUnload.listen((event) { StorageService.webStorage @@ -135,26 +130,29 @@ class _SplashState extends State { await ServerDataProvider.getData(); } + + // --- بخش اصلاح شده --- + // ابتدا بررسی می‌کنیم که کاربر باید به کدام صفحه اصلی برود + final String destinationRoute = token == null ? Routes.authenticaion : Routes.home; + final dynamic routeArguments = token == null ? false : {'showDialogs': true}; - navigatorKey.currentState!.pushReplacementNamed( - token == null ? Routes.authenticaion : Routes.home, - arguments: token == null ? false : null, + // اگر لینک ورودی وجود داشت، آن را به عنوان آرگومان به صفحه Home می‌فرستیم + if (destinationRoute == Routes.home && initialURI != null) { + (routeArguments as Map)['deepLinkUri'] = initialURI; + initialURI = null; // لینک را مصرف می‌کنیم تا دوباره استفاده نشود + } + + // در نهایت به مسیر تعیین شده می‌رویم + await navigatorKey.currentState!.pushReplacementNamed( + destinationRoute, + arguments: routeArguments, ); + // --- پایان بخش اصلاح شده --- - return; - - // await HomeWidget.getWidgetData("cRouteGoTo", defaultValue: '') - // .then((cRouteGoTo) async { - // if (cRouteGoTo!.isNotEmpty) { - // navigatorKey.currentState! - // .pushNamed(cRouteGoTo.toString(), arguments:cRouteArgs ); - // HomeWidget.saveWidgetData("cRouteGoTo", ''); - // } - // }); } catch (e) { setState(() { _errorOccured = true; }); } } -} +} \ No newline at end of file diff --git a/web/.well-known/assetlinks.json b/web/.well-known/assetlinks.json new file mode 100644 index 0000000..17c30de --- /dev/null +++ b/web/.well-known/assetlinks.json @@ -0,0 +1,13 @@ +[ + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "com.didvan.didvanapp", + "sha256_cert_fingerprints": [ + "02:5A:86:49:AE:B4:FF:FE:5B:D0:C6:D7:F9:FF:85:60:F0:CF:AE:2F:39:8C:9D:F6:0D:4A:41:5D:EA:07:BE:8B", + "CA:F0:F8:9D:6D:5C:70:A1:C0:E8:F6:4D:19:DA:49:12:D4:F9:D6:C1:DB:E7:1C:B5:4B:ED:F5:A5:AA:DA:EE:DB" + ] + } + } +] \ No newline at end of file