flutter dynamic-link

준형정·2023년 10월 17일

flutter 딥링크 구현

pubspec.yaml 에 의존성 추가

firebase_dynamic_links: ^5.3.7

android 설정

androidmanifest.xml

<!-- [] for dynamic link start-->
            <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="https://eusample.page.link(여기에 파이어베이스에서 설정한 링크 입력)"
                    android:scheme="https"/>
            </intent-filter>
            <!-- [] for dynamic link end-->

ios 설정

Universal Link 등록
ios/Runner/Runner.entitlements 파일에 아래내용 추가

<?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>com.apple.developer.associated-domains</key>
   <array>
      <string>applinks:파이어베이스에서 설정한 링크 입력</string>
   </array>
</dict>
</plist>

커스텀 도메인 등록
앞서 무료 제공된 도메인이 아니라 커스텀된 도메인을 등록했다면 ios/Runner/Info.plist 파일에 아래와 같이 추가해줘야 한다.

<key>FirebaseDynamicLinksCustomDomains</key>
<array>
   <string>https://커스텀 도메인 입력</string>
</array>

코드 구현


Future<String> createDynamicLink(
    {bool short = true,
    required String path,
    required String queryParam}) async {
  FirebaseDynamicLinks dynamicLinks = FirebaseDynamicLinks.instance;

  final DynamicLinkParameters parameters = DynamicLinkParameters(
    uriPrefix: "https://eusample.page.link",
    link: Uri.parse('https://eusample.page.link/$path?$queryParam'),
    androidParameters: const AndroidParameters(
      packageName: 'contact.eu.sample.eu_sample',
      minimumVersion: 0,
    ),
    iosParameters: const IOSParameters(
      bundleId: 'contact.eu.sample.eu_sample',
      minimumVersion: '1.0.0',
    ),
  );

  //print(parameters);
  Uri? url;
  if (short) {
    final ShortDynamicLink shortLink = await dynamicLinks.buildShortLink(
      parameters,
    );
    url = shortLink.shortUrl;
  } else {
    url = await dynamicLinks.buildLink(parameters);
  }
  return url.toString();
}

Future<void> initDynamicLinks() async {
  FirebaseDynamicLinks dynamicLinks = FirebaseDynamicLinks.instance;

  /// 다이나믹 링크 콜백 등록
  dynamicLinks.onLink.listen((dynamicLinkData) {
    Uri deepLink = dynamicLinkData.link;

    _handleDynamicLink(deepLink);
  }).onError((error) {});

  final PendingDynamicLinkData? data =
      await FirebaseDynamicLinks.instance.getInitialLink();
  final Uri? deepLink = data?.link;

  if (deepLink != null) {
    _handleDynamicLink(deepLink);
  }
}

핸들링 구현부


/// 딥링크 path 에 따라 개별 동작 실행
void _handleDynamicLink(Uri deepLink) {
  switch (deepLink.path) {
    case "/경로":
      Map<String, dynamic> queryParam = deepLink.queryParameters;
		
       필요한 기능 구현
      break;
    default:
      break;
  }
}

main.dart

	///init firebase
    await Firebase.initializeApp();
	이후 다이나믹 링크 초기화 메서드 호출
    await initDynamicLinks();
profile
접니다

0개의 댓글