Flutter에서 Deep Link 적용

2024-04-03 14:10 | Flutter

Flutter에서 Deep Link 적용을 위한 uni_links 패키지 사용

Android (AndroidMenifest.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:scheme="unilinks"
          android:host="host"
          android:pathPrefix="/path/subpath" />
  </intent-filter>
 

Link 초기화

이 함수는 앱의 수명 초기에 처리해야 하며 한 번만 처리해야 한다.

  Future<void> _handleInitialUri() async {
 
    if (!_initialUriIsHandled) {
      _initialUriIsHandled = true;
      try {
        final uri = await getInitialUri();
        if (uri == null) {
          print('no initial uri');
        } else {
          print('got initial uri: $uri');
        }
        if (!mounted) return;
 
      } on PlatformException {
        print('falied to get initial uri');
      } on FormatException catch (err) {
        if (!mounted) return;
        print('malformed initial uri');
      }
    }
  }
 

딥링크 호출시 수신용 핸들러 작성

앱이 이미 시작된 상태에서 앱 링크를 처리 (foreground or background). uni_links의 쿼리를 이용하여 파라미터 처리.

 
void _handleIncomingLinks() {
    if (!kIsWeb) {
      _sub = uriLinkStream.listen((Uri? uri) {
        if (!mounted) return;
 
        final queryParams = uri?.queryParametersAll.entries.toList();
        for (final item in queryParams!) {
          print('_ > got uri: ${item.key} ${item.value.join(', ')}');
        }
      }, onError: (Object err) {
        if (!mounted) return;
        print('got err: $err');
      });
    }
  }
 

initState, dispose 에 적용

 
bool _initialUriIsHandled = false;
 
class _MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
 
  StreamSubscription? _sub;
 
  @override
  void initState() {
    super.initState();
    _handleIncomingLinks();
    _handleInitialUri();
  }
 
  @override
  void dispose() {
    _sub?.cancel();
    super.dispose();
  }
 

딥링크 호출을 위해 android CLI 도구를 사용

안드로이드 스튜디오를 설치했다고 가정 (SDK 플랫폼 도구 포함)

 
$ANDROID_HOME/platform-tools/adb shell 'am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "unilinks://host/path/subpath/?shareId=bfgs4569&userId=wangwang"'