본문 바로가기
flutter

(flutter) uni_links + go_router => routing 안됨 (해결 못함.)

by Rogan_Kim 2023. 8. 30.
728x90

상황

- app deep link를 구현하려고 uni_links 사용 debugt시에는 app이 terminated의 상황을 테스트 해보지 못하였고, background상태에서 잘 되서 넘어감. 하지만 베타 서비스를 오픈했는데 앱이 완전 종료되었을때 deep link가 제대로 동작안하는 버그가 발생.

 

 

deep link는 kakao의 메시지 템플릿을 활용하여 Android Scheme로 구현

 

해당 링크의 '지금 바로 시작하기'를 누를시 회원가입 페이지로 넘어가는게 목표였다 하지만

 

landing page를 거쳐서 로그인 정보가없어서 login 페이지로 넘어가는 형상 

 

내가 이동하고 싶은 페이지 

 

 

 

 

문제 해결 과정 

1. 우선 내가 짠 코드를 의심.

uni_links를 사용하여 deep link를 처리하였었다.

코드 흐름만 보면 runApp을 실행하고 link listen을 시도한다

void main() async {
  // main() 함수에서 await 키워드를 사용하여 비동기 작업을 수행해야 하는 경우 사용해야함.
  WidgetsFlutterBinding.ensureInitialized();
  await dotenv.load(fileName: ".env");

  // runApp() 호출 전 Flutter SDK 초기화
  // https://developers.kakao.com/docs/latest/ko/getting-started/sdk-flutter#apply-sdk
  KakaoSdk.init(
    nativeAppKey: dotenv.env['YOUR_NATIVE_APP_KEY'],
    // javaScriptAppKey: dotenv.env['YOUR_JAVASCRIPT_APP_KEY'],
  );

  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  await FirebaseMessaging.instance.setAutoInitEnabled(true);

  FirebaseMessaging.instance.requestPermission(
    badge: true,
    alert: true,
    sound: true,
  );

  /// Rogan : [intl: ^0.18.1](https://pub.dev/packages/intl)
  await initializeDateFormatting();

  await FlutterLocalNotification.init();

  final preferences = await SharedPreferences.getInstance();

  /// 가로 모드 막기
  SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
  runApp(
    ProviderScope(
      overrides: [
        localSharedPreferenceProvider
            .overrideWith(() => LocalSharedPreferenceState(preferences))
      ],
      child: const MyApp(),
    ),
  );

  // 알림 허용 여부는 App build 후에
  final alarmPermission =
      await FlutterLocalNotification.requestNotificationPermission();
  preferences.setBool('_todoNotification', alarmPermission);
}

class MyApp extends ConsumerStatefulWidget {
  const MyApp({super.key});

  @override
  ConsumerState<ConsumerStatefulWidget> createState() {
    return _MyApp();
  }
}

class _MyApp extends ConsumerState<MyApp> {
  bool _debugShowCheckedModeBanner = true;
  StreamSubscription? _linkSubscription;
  @override
  void initState() {
  /// 여기부분 url listen
    _linkSubscription = linkStream.listen((link) {
      _debugShowCheckedModeBanner = false;
      if (link != null) {
        Uri uri = Uri.parse(link);
        final type = uri.queryParameters['type'];
        joinParentUserId.value = int.parse(uri.queryParameters['user_id']!);

        if (type == 'sign-in') {
          uniLinkType.value = UniLinkType.signIn;
        } else if (type == 'sign-up') {
          uniLinkType.value = UniLinkType.signUp;
        }
      }
      setState(() {});
    });
    super.initState();
  }

  @override
  void dispose() {
    _linkSubscription?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: ref.watch(routerProvider),
      title: 'chaam',
      debugShowCheckedModeBanner: _debugShowCheckedModeBanner,
      themeMode: ThemeMode.light,
      // ThemeMode.system, // https://api.flutter.dev/flutter/material/MaterialApp/themeMode.html
      theme: lightThemeData,
      darkTheme: darkThemeData,
      //앱 자체 언어 설정 함으로써 캘린더를 한국어로 변경
      localizationsDelegates: const [
        // 앱의 로컬라이제이션을 구성합니다.
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate
      ],
      supportedLocales: const [
        // 앱에서 지원하는 언어 목록을 설정합니다.
        Locale('ko', 'KR'), // 한국어
        Locale('en', 'US'), // 영어
      ],
    );
  }
}

Q : runApp이 언제 실행되지?

A :  앱이 켜졌을때 그럼 terminated 상태일때는 모르겠네?

이 단순한 원리를 앱개발한지 2달 밖에 안됬다고 놓치고 있다가 이번에 깨달았다.

그래서 해당 코드를 main.dart로 올려서 실행 해봤지만 역시 되지 않았다.

(firebase massage는 terminated상태에서도 잘 받드만 왜 안돼??)

 

 

2. context가 실행되고 페이지 이동을 해야하니까 억지로 아래의 예시처럼 delay를 걸어보았다.

(과정을 따로 기록하지 않아서 그당시 코드는 없습니다)

 Future.delayed(const Duration(seconds: 1), () {
	context.go(SettingsRoute.routePath);
});

 

3. github 이슈 찾아보기

 

- https://github.com/flutter/flutter/issues/103659

- [go_router] uni_links seems to conflict with the default router behavior for deeplinking #12

 

 

하루 종일 찾아보고 테스트 해본 결과 go_router를 제거하면 uni_link를 사용하여 deep link를 처리 할 수있다는 결론까지는 왔다.

몰론 내가 원하는 결론이 아니였다.  바뻐서 타협한 결론..

 

 

결국 당장은 pmf찾는 과정이기에 deep link는 피해가는 쪽으로 개발을 진행하게 되었고,

앱 생계의 필수인 deep link를 제대로 알고 다시 정리 할 예정이다

- https://docs.flutter.dev/ui/navigation/deep-linking

 

728x90

댓글