flutter, dynamic links 사용 구축기

flutter app 을 개발하면서 특정 도메인으로 dynamic links 를 사용한 경험을 기록한다. (개인 도메인을 사용하지 않으면 page.link 라는 도메인을 firebase 에서 제공한다.)

1. Firebase, Custom Domain Hosting 설정

먼저 특정 도메인을 등록하려면 해당 도메인의 호스팅을 firebase 에 등록해야한다.

1) Custom 도메인 등록

시작하기를 선택

시작하기를 누루면 콘솔에 Firebase CLI 설치 및 초기화 등을 설정할 것을 권장하는 화면이 나오는데 그냥 다음을 눌러 완료한다.

완료 후에 "커스텀 도메인 추가" 를 눌러 도메인을 추가 한다.

초기에 커스텀 도메인을 추가하게 되면 해당 도메인의 DNS 설정을 바꿔줄 것을 요구한다.

2) Firebase Hosting등록

이 과정은 로컬 프로젝트를 firebase hosting 에 올리기 위한 작업이다. 여기서는 dynamic links 를 사용할 목적이니 firebase.json 설정에 집중하면 된다.

npm install -g firebase-tools
firebase login
firebase init
{
  "hosting": {
    "public": "public",
    "ignore": [
      "**/.*",
      "**/node_modules/**"
    ],
    "appAssociation": "AUTO",
    "rewrites": [
      {
        "source": "/to/**",
        "dynamicLinks": true
      },
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
firebase.json

위 설정을 서버에 반영하는 명령어이다.

firebase deploy --only hosting

3) Dynamic Links, 프리픽스 추가

2. Firebase, SHA1, SHA256 설정

Dynamic Links 를 생성하려면 앱에 디지털 지문을 등록해야 한다.

1) Android Studio, SHA1/SHA256 확인

터미널에서 아래 명령어로 지문을 확인한다.

gradlew signingReport 

지문을 복제한 후에 "Firebase console > 프로젝트 설정" 에 하단메뉴에 디지털 지문을 추가한다.

3. Flutter, Project 설정

1) AndroidManifest.xml (./android/app/src/main/)

<!-- [] 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:scheme="https" android:host="link.snaptok.org" />
</intent-filter>
<!-- [] for dynamic link end-->
android:host 에 설정 도메인을 입력

2) main.dart 설정

# await Firebase.initializeApp 선언 후 아래 함수를 호출하도록 설정했다.

Future<void> initDynamicLinks() async {
  final PendingDynamicLinkData? initialLink = await FirebaseDynamicLinks.instance.getInitialLink();
  if (initialLink != null) {
    final Uri deepLink = initialLink.link;
   
    Get.toNamed(deepLink.path, arguments: deepLink.path);
  }
  FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
	# GetX를 사용하므로 path 로 인자값을 묶어서 이동하도록 처리
	Get.toNamed(dynamicLinkData.link.path, arguments: dynamicLinkData.link.query);
  }).onError((error) {
    // Handle errors
  });
}

3) dynamic links 생성

이제 테스트할 동적링크를 생성 하면 되는데, 아래 웹페이지에서 생성하거나 웹API를 호출해서 생성하면 된다.