Flutter 앱에서 Firebase 동적 링크 수신

생성한 Firebase 동적 링크를 수신하려면 앱에 동적 링크 SDK를 포함하고, 앱이 로드될 때 FirebaseDynamicLinks.getDynamicLink() 메서드를 호출하여 동적 링크로 전달된 데이터를 가져와야 합니다.

  1. 아직 수행하지 않았으면 Flutter에 Firebase SDK를 설치하고 초기화합니다.

  2. Flutter 프로젝트의 루트 디렉터리에서 다음 명령어를 실행하여 동적 링크 플러그인을 설치합니다.

    flutter pub add firebase_dynamic_links
    
  3. Android 앱을 빌드하는 경우 Firebase Console의 프로젝트 설정 페이지를 열고 SHA-1 서명 키를 지정했는지 확인합니다. 앱 링크를 사용하는 경우에도 SHA-256 키를 지정합니다.

플랫폼 통합

앱을 빌드할 플랫폼에 대한 다음 플랫폼 통합 단계를 완료합니다.

Android

Android에서는 앱이 설치된 경우 동적 링크가 사용자 도메인으로 리디렉션되므로 도메인의 인텐트 필터 포착 딥 링크를 새로 추가해야 합니다. 이렇게 하려면 Play 스토어에서 앱을 설치 및 업데이트하고 계속 버튼을 탭한 후 앱에서 동적 링크 데이터를 수신해야 합니다. AndroidManifest.xml:

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data
        android:host="example.com"
        android:scheme="https"/>
</intent-filter>

사용자가 지정한 스키마 및 호스트로 연결되는 딥 링크가 포함된 동적 링크를 열면 앱에서 이 인텐트 필터로 링크를 처리하는 활동을 시작합니다.

다음 단계는 서명 인증서의 SHA-256 디지털 지문이 앱의 Firebase Console에 등록되었는지 확인하는 것입니다. SHA-256 디지털 지문을 가져오는 방법에 관한 자세한 내용은 클라이언트 인증 페이지에서 확인할 수 있습니다.

Apple 플랫폼

  1. 아직 없는 경우 Apple 개발자 계정을 생성합니다.

  2. Firebase Console의 프로젝트 설정 페이지에서 iOS 앱이 App Store ID와 팀 ID로 올바르게 구성되어 있는지 확인합니다.

  3. Apple 개발자 사이트에서 연결된 도메인 기능이 사용 설정된 앱의 프로비저닝 프로필을 만듭니다.

  4. Xcode에서 다음을 수행합니다.

    1. TARGETS 헤더에서 앱을 엽니다.

    2. 서명 및 기능 페이지에서 팀이 등록되어 있고 프로비저닝 프로필이 설정되어 있는지 확인합니다.

    3. 서명 및 기능 페이지에서 연결된 도메인을 사용 설정하고 연결된 도메인 목록에 다음을 추가합니다(예시를 내 도메인으로 바꾸기).

      applinks:example.page.link
      
    4. 정보 페이지에서 프로젝트에 URL 유형을 추가합니다. URL 스키마 필드를 앱의 번들 ID로 설정합니다. (식별자는 Bundle ID 또는 원하는 대로 지정할 수 있습니다.)

    5. Firebase 프로젝트의 커스텀 도메인을 설정한 경우 FirebaseDynamicLinksCustomDomains 키를 사용하여 iOS 프로젝트의 Info.plist 파일에 동적 링크 URL 프리픽스를 추가합니다.

      <?xml version="1.0" encoding="UTF-8"?>
      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
      <dict>
      <key>FirebaseDynamicLinksCustomDomains</key>
      <array>
          <string>https://custom.domain.io/path1</string>
          <string>https://custom.domain.io/path2</string>
      </array>
      
      ...other settings
      
      </dict>
      </plist>
      
    6. 선택사항: 동적 링크 SDK의 iOS 페이스트보드 사용을 중지합니다.

      기본적으로 동적 링크 SDK는 페이스트보드를 사용하여 설치 후 딥 링크의 안정성을 개선합니다. 사용자가 동적 링크를 열었는데 앱을 먼저 설치해야 하는 경우에 페이스트보드를 사용하면 사용자가 설치 후 처음으로 앱을 열 때 원래 링크된 콘텐츠로 바로 이동할 수 있습니다.

      단점은 iOS 14 이상에서 페이스트보드를 사용하면 알림을 트리거한다는 것입니다. 따라서 사용자가 앱을 처음 열 때 페이스트보드에 동적 링크 URL이 포함되어 있으면 앱이 페이스트보드에 액세스했다는 알림이 표시되어 혼란을 일으킬 수 있습니다.

      이 동작을 사용 중지하려면 Xcode 프로젝트의 Info.plist 파일을 수정하고 FirebaseDeepLinkPasteboardRetrievalEnabled 키를 NO로 설정합니다.

애플리케이션에서 동적 링크를 처리하려면 두 가지 시나리오를 구현해야 합니다.

종료 상태

다음 메서드를 설정합니다.

  1. FirebaseDynamicLinks.getInitialLink - Future<PendingDynamicLinkData?>를 반환합니다.
  2. FirebaseDynamicLinks.onLink - PendingDynamicLinkData?가 포함된 Stream을 반환하는 이벤트 핸들러입니다.

Android는 항상 종료된 상태에서 FirebaseDynamicLinks.getInitialLink를 통해 링크를 수신하지만 iOS에서는 보장되지 않습니다. 따라서 애플리케이션이 링크를 수신하도록 다음 순서로 모두 설정하는 것이 좋습니다.

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseConfig.platformOptions);

  // Check if you received the link via `getInitialLink` first
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();

  if (initialLink != null) {
    final Uri deepLink = initialLink.link;
    // Example of using the dynamic link to push the user to a different screen
    Navigator.pushNamed(context, deepLink.path);
  }

  FirebaseDynamicLinks.instance.onLink.listen(
        (pendingDynamicLinkData) {
          // Set up the `onLink` event listener next as it may be received here
          if (pendingDynamicLinkData != null) {
            final Uri deepLink = pendingDynamicLinkData.link;
            // Example of using the dynamic link to push the user to a different screen
            Navigator.pushNamed(context, deepLink.path);
          }
        },
      );

  runApp(MyApp(initialLink));
}

그런 다음 애플리케이션 로직에서 링크가 처리되었는지 확인하고 작업을 수행할 수 있습니다. 예를 들면 다음과 같습니다.

if (initialLink != null) {
  final Uri deepLink = initialLink.link;
  // Example of using the dynamic link to push the user to a different screen
  Navigator.pushNamed(context, deepLink.path);
}

백그라운드 / 포그라운드 상태

애플리케이션이 열려 있는 동안 또는 백그라운드에서 FirebaseDynamicLinks.onLink getter를 사용합니다.

FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
  Navigator.pushNamed(context, dynamicLinkData.link.path);
}).onError((error) {
  // Handle errors
});

또는 애플리케이션을 열 때 정확한 동적 링크가 사용되었는지 확인하려면 getDynamicLink 메서드에 다음을 대신 전달합니다.

String link = 'https://dynamic-link-domain/ke2Qa';

final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getDynamicLink(Uri.parse(link));

iOS에서 동적 링크를 테스트하려면 실제 기기를 사용해야 합니다. 또한 종료된 앱 상태(즉, 스와이프하여 앱을 닫은 상태)에서 동적 링크를 테스트하는 경우 출시 모드 (즉, flutter run --release)에서도 앱을 실행해야 합니다.