Firebase dynamic link와 kakao flutter sdk를 동시 사용할 경우, ios에서 dynamic link가 수신되지 않습니다

sdk 버전: 1.3.1, 1.4.0 버전에서 모두 이슈가 발생합니다.
ios, android 모두를 대응하고 있습니다.
pubspec의 의존성은 다음과 같습니다:


dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl_phone_number_input: ^0.7.0+2
  shimmer: ^2.0.0
  carousel_slider: ^4.0.0
  webview_flutter: ^3.0.4
  flutter_web_auth: ^0.5.0
  firebase_crashlytics: ^3.0.15
  flutter_markdown: ^0.6.14
  get: ^4.6.1
  url_launcher: ^6.1.9
  package_info_plus: "^3.0.3"
  adaptive_action_sheet: ^2.0.0
  custom_rounded_rectangle_border: ^0.2.0-nullsafety.0
  flutter_svg: ^2.0.2
  amplitude_flutter: ^3.8.1
  sentry_flutter: ^6.20.1
  cupertino_icons: ^1.0.4
  version: ^3.0.2
  photo_view: ^0.14.0
  flutter_share: ^2.0.0
  firebase_core: ^2.7.0
  device_info_plus: ^8.1.0
  firebase_analytics: ^10.1.4
  sign_in_with_apple: ^4.3.0
  firebase_auth: ^4.2.9
  graphql_flutter: ^5.1.2
  iamport_flutter: ^0.10.0
  #kakao_flutter_sdk: ^1.3.1
  flutter_secure_storage: ^8.0.0
  flutter_dotenv: ^5.0.0
  firebase_dynamic_links: ^5.0.15
  firebase_remote_config: ^3.0.13
  firebase_messaging: ^14.2.5
  shared_preferences: ^2.0.12
  loadmore: ^2.0.1
  validators: ^3.0.0
  image_picker: ^0.8.6+2
  daum_postcode_search: ^0.0.1

appdelegate.swift는 다음과 같습니다:

import Flutter
import UIKit

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

main.dart는 다음과 같습니다:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  await dotenv.load(fileName: '.env');
  KakaoSdk.init(
    nativeAppKey: dotenv.env['KAKAO_NATIVE_KEY'],
    javaScriptAppKey: dotenv.env['KAKAO_JAVASCRIPT_KEY'],
  );
  //...
  // Pass all uncaught errors from the framework to Crashlytics.
  FlutterError.onError = FirebaseCrashlytics.instance.recordFlutterError;
  await SentryFlutter.init(
    (options) {
      options.dsn =
          'DSN;
    },
    appRunner: () => runApp(App(
        firstScreen:
            (!(result is int) || (result is bool && (result as bool) == false))
                ? LoginScreen()
                : Tabs())),
  );
}

이와 같이 코드를 작성할 때, kakao sdk를 의존성에 명기하지 않았을 경우에는 firebase dynamic link의 .getInitialLink를 통한 링크 수신이 정상적으로 이뤄지지만, 의존성에 flutter kakao sdk를 명기할 경우에는 이뤄지지 않습니다.

또한 uni_links 패키지를 사용해 url 을 가져오려 시도했을 떄에도 항상 null이 출력되는 것으로 보아, firebase_dynamic_link 패키지만의 문제는 아닌 것으로 판단하고 있습니다.

지금은 사용할 수 없는 https://github.com/JosephNK/flutter_kakao_login 패키지에서는, flutter_kakao_login/SwiftFlutterKakaoLoginPlugin.swift at master · JosephNK/flutter_kakao_login (github.com) 를 참조하였을 때 다음과 같이 application 함수를 overriding 하지 않았습니다:

//    override public func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
//        if (AuthApi.isKakaoTalkLoginUrl(url)) {
//            return AuthController.handleOpenUrl(url: url)
//        }
//        return false
//    }

떄문에 packages/kakao_flutter_sdk_common/ios/Classes/SwiftKakaoFlutterSdkPlugin.swiftpublic func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool 함수가 혹시 문제가 있을까 추정해보는 중입니다! 혹시 다른 url interceptor들에 영향을 미치는 부분이 있는지 확인 부탁드립니다!

다른 문의글의 카카오톡내 인앱브라우저에서 Firebase DynamicLink 호출 시, 파라메터 전달 안된다는 문제와는 무관하고


Firebase DynamicLink를 통해 앱 호출 했으나 Kakao Flutter SDK가 관련 정보 수신에 영향을 준다라고 이해했습니다. 맞나요?

테스트용 링크 : https://pocdib.page.link/J8vN

제가 앱을 설치하고 위링크를 실행 했을때는 앱 실행 자체가 안되는 것으로 보이는데요.
현재 스토어에 올라간 앱이 kakao flutter sdk 적용된 앱인가요?

Firebase DynamicLink를 통해 앱 호출 했으나 Kakao Flutter SDK가 관련 정보 수신에 영향을 준다라고 이해했습니다. 맞나요?

현재 그런 것으로 보입니다!

제가 앱을 설치하고 위링크를 실행 했을때는 앱 실행 자체가 안되는 것으로 보이는데요.

카카오 인앱브라우저에서는 안 되지만, 타 메신저에서는 실행이 되고 있습니다.
ezgif-4-da3fcaba00

현재 스토어에 올라간 앱이 kakao flutter sdk 적용된 앱인가요?

현재 올라간 바이너리는 적용이 안 되어있고, 테스트 과정에서 발견한 문제입니다. 현재는 지원이 중단된 https://github.com/JosephNK/flutter_kakao_login 이 적용되어 있습니다.

테스트하신 타 메신저는 페이스북 메신저인가요?

네이버앱 인앱브라우저에서도 앱으로 이동하지 않고 웹페이지만 뜨는터라 호출하는 앱 문제인지 판단하기가 좀 모호하네요.


만약 수신측 SDK문제인 경우, 아래 라이브러리는 카카오에서 제공하는 라이브러리가 아닙니다. 카카오에서 제공하는 라이브러리 사용 부탁드려요.

카카오에서 제공하는 SDK로 전환중이신거군요?

관련하여 재현 가능한지 Flutter SDK담당자에게 확인 요청 하였습니다.
(검토는 차주에 진행되니 참고 부탁드립니다.)

테스트하신 타 메신저는 페이스북 메신저인가요?

텔레그램입니다!

네이버앱 인앱브라우저에서도 앱으로 이동하지 않고 웹페이지만 뜨는터라 호출하는 앱 문제인지 판단하기가 좀 모호하네요.

아, 현재 핵심 문제는 ‘링크를 탭할때 바로 앱으로 이동하는가’ 가 아니라(인앱 웹브라우저를 우선 표시하는 경우, 현 버전에서도 웹페이지에서 버튼을 탭할 경우 이동하도록 구현되어 있습니다) ‘앱이 실행된 후 앱 내에서 해당 링크의 경로를 전혀 인식히지
못하는 것’입니다. 새로운 sdk를 사용한 후에도 앱은 실행됩니다. 다만 앱이 실행된 이후 해당 링크의 url을 앱 내에서 받아올수가 없습니대.

카카오에서 제공하는 SDK로 전환중이신거군요?

네 맞습니다.

관련하여 재현 가능한지 Flutter SDK담당자에게 확인 요청 하였습니다.
(검토는 차주에 진행되니 참고 부탁드립니다.)

감사합니다!:hugs:

안녕하세요

답변이 조금 늦었습니다ㅠㅠ

해당 이슈에 대해서 확인해봤는데 1.4.0 버전에서 카카오 커스텀 URL 수신 기능이 추가되면서 발생한 이슈인 것으로 파악됩니다. (1.3.1 버전에서도 재현된다고 하셨는데 1.4.0 버전이 캐싱되어 1.3.1 버전의 의존성을 추가했음에도 1.4.0 버전이 사용된 것으로 추측됩니다)

이슈 원인은 kakao_flutter_sdk 내부에 구현된 application(_:didFinishLaunchingWithOptions:) 메소드에서 카카오 커스텀 URL이 아닌 경우(카카오SDK에서 처리할 수 있는 커스텀 스킴이 아닌 경우) false를 반환함으로써 파이어베이스까지 url이 전달되지 않는 것으로 보입니다.

해당 내용 수정해서 배포하기에 앞서 테스트가 가능하시다면 SwiftKakaoFlutterSdkPlugin.swift 파일의 249번 라인 제거, 251번 라인의 false를 true로 수정했을 때 현재 개발환경에서 정상 동작하는지 테스트 부탁드리겠습니다. (kakao_flutter_sdk 1.4.0 버전 이상)

SwiftKakaoFlutterSdkPlugin.swift 파일은 안드로이드 스튜디오 기준으로 아래의 경로에서 찾을 수 있습니다

스크린샷 2023-03-03 오전 10.00.48

답변이 늦어서 죄송합니다! 현재 저희 코드베이스에 확인해야 할 점들이 있어, 해당 문제를 먼저 해결한 후 해당 솔루션을 테스트해 보도록 하겠습니다! 확인해 주셔서 감사합니다! :bowing_man:

확인했습니다! 해당 솔루션 적용시 정상작동하네요!

2개의 좋아요

실례되지 않는다면, 해당 문제가 해결된 버전의 카카오 flutter sdk 코드가 언제쯤 배포될 지 알 수 있을까요? 저희 회사의 일정 조율을 위해서 가능하다면 알려주시면 감사하겠습니다!

내부적으로 조금 더 검토해보고 빠르면 이번주 말, 늦으면 다음주 중으로 배포할 수 있도록 하겠습니다!

알겠습니다! 감사합니다 :heart_eyes:

안녕하세요

제보주신 이슈 수정된 1.4.2 버전 배포되었습니다.

이슈 제보주셔서 감사합니다!

1개의 좋아요

감사합니다! 테스트한 후 이슈 없으면 확인 드리겠습니다!:bowing_man:

1개의 좋아요