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"'