TIL2024. 8. 8.

URL scheme 중 canOpenUrl 오류, 딥링크의 개념

#React Native#Android

목표

위치 (좌표 or 텍스트)를 가지고 지도 아이콘을 클릭을 통해 지도앱 내 길찾기 화면으로 연결

문제

canOpenUrl() 이 안 먹음

원인은

Android 보안 feature 로 새로 추가된 Package Visibility 때문. 이는 iOS의 LSApplicationQuriesSchemes와 비슷

해결법

은 확인 url scheme의 패키지를 등록해두는 것

아래는 구글지도, 네이버지도, 카카오맵을 등록

// AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <queries> <package android:name="com.google.android.apps.maps" /> <package android:name="com.nhn.android.nmap" /> <package android:name="net.daum.android.map" /> </queries> ...

성공적인 코드 작성 : 카카오맵 (예)

// 주어진 위치를 가지고 , 카카오맵의 설치 여부를 확인 후 앱으로 연결하는 로직 // (미설치 시 플레이스토어로 연결) const kakaoMapURL = `kakaomap://search?q=${where}` const kakaoSupported = await Linking.canOpenURL("kakaomap://open"); const playStoreKakaoURL = 'market://details?id=net.daum.android.map'; if (kakaoSupported) { Linking.openURL(kakaoMapURL); } else { Linking.openURL(playStoreKakaoURL); }

한 술 더 떠

나는 지도앱 모두에 대해 ‘연결 프로그램’을 통해 선택 ⇒ 키워드로 검색 까지 진행하고 싶었음

위 글을 읽던 중 ‘연결 프로그램’ 을 통해 깔린 지도앱들을 선택할 수 있는 기능에 대한 실마리를 얻음

딥링크(DEEP LINK)란?

  • 모바일 앱이나 웹사이트 내의 특정 화면이나 콘텐츠로 직접 연결되는 링크
  • 딥링크의 종류
종류설명
기본 딥링크URL로 앱이 설치되어 있으면 앱을 열고, 없으면 웹페이지를 여는 방식(https://example.com/product/123)
커스텀 스킴 딥링크앱 전용 URL 스킴을 사용하는 방식 (myapp://product/123)
유니버설 링크 (iOS) / 앱 링크 (Android)앱이 설치되어 있으면 앱이 실행되고, 없으면 브라우저로 이동. 보안과 호환성 강화된 방식

즉, 내가 쓸 건 유니버설링크/앱 링크

참고 : ‘널리 알려진 스킴들’

sms:// <- 문자

tel:// <- 전화

mailto:// <- 메일

geo:// <- 위치/지도

market:// <- 앱마켓

코드 작성 예시.

// 위도 경도도 알 때 const scheme = Platform.select({ ios: 'maps://0,0?q=', android: 'geo:0,0?q=' }); const latLng = `${lat},${lng}`; const url = Platform.select({ ios: `${scheme}${fullAddress}@${latLng}`, android: `${scheme}${latLng}(${fullAddress})` }); Linking.openURL(url); // 위치명만 알 때 const url = Platform.select({ ios: `maps:0,0?q=${fullAddress}`, android: `geo:0,0?q=${fullAddress}`, }) Linking.openURL(url)
요즘 작업송