
- 경로 페이지에서 네비연동 버튼을 클릭했을 때, 네이버 지도 앱으로 이동하는 동작이 필요했다.
- 네이버 지도 앱으로 이동하기 위해 iOS와 AOS로 구분했다.
| iOS + 네이버 앱 설치 O | iOS + 네이버 앱 설치 X |
|---|---|
![]() | ![]() |
안드로이드 추가 테스트 필요
/** 네비연동 버튼 클릭 */
const handleNaviLinkClick = () => {
const isAndroid = /android/i.test(navigator.userAgent);
const isiOS = /iPhone|iPad|iPod/i.test(navigator.userAgent);
// 액션 경로 설정
const actionString = routeData
.map((element, idx) => {
if (idx === 0) {
return `slat=${element.lat}&slng=${element.lng}&sname=${element.title}`;
} else if (idx === routeData.length - 1) {
return `dlat=${element.lat}&dlng=${element.lng}&dname=${element.title}`;
} else {
return `v${idx}lat=${element.lat}&v${idx}lng=${element.lng}&v${idx}name=${element.title}`;
}
})
.join("&");
if (isAndroid) { // 안드로이드 테스트 필요
location.href = `intent://route/car?${actionString}&appname={YOUR_APP_NAME}#Intent;scheme=nmap;action=android.intent.action.VIEW;category=android.intent.category.BROWSABLE;package=com.nhn.android.nmap;end`;
} else if (isiOS) {
const clickedAt = +new Date();
location.href = `nmap://route/car?${actionString}&appname={YOUR_APP_NAME}`;
setTimeout(function () {
if (+new Date() - clickedAt < 2000) {
location.href = "http://itunes.apple.com/app/id311867728?mt=8";
}
}, 1500);
}
};
http://, ftp://, market://과 같은 문자열을 URL Scheme라 부른다.nmap://으로 시작하며, 구문의 형식은 다음과 같다."nmap://actionPath?parameter=value&appname={YOUR_APP_NAME}"
"nmap://" // 네이버 지도 앱 접근 URL Scheme
"actionPath?parameter=value&" // 액션 + 입력 파라미터
"appname={YOUR_APP_NAME}" // URL Scheme 호출 앱

appname에 개발 URL을 넣어줬다. (배포 후, 배포 URL로 변경 예정)네이버 지도 앱 URL Scheme을 사용하려면 네이버 지도 앱을 설치하도록 구현해야 한다.
Android
인텐트 URL을 사용하면, 앱이 설치되어 있지 않은 경우 자동으로 Google Play 스토어로 이동한다.
인텐트 URL 구조 : intent://actionPath?parameter=value&appname={YOUR_APP_NAME}#Intent;scheme=nmap;action=android.intent.action.VIEW;category=android.intent.category.BROWSABLE;package=com.nhn.android.nmap;end
iOS
JavaScript 타이머를 이용해 App Store로 분기시키는 방법을 사용한다.
/** 네비연동 버튼 클릭 */
const handleNaviLinkClick = () => {
const clickedAt = +new Date();
location.href =
"nmap://actionPath?parameter=value&appname={YOUR_APP_NAME}";
setTimeout(function () {
if (+new Date() - clickedAt < 2000) {
location.href = "http://itunes.apple.com/app/id311867728?mt=8";
}
}, 1500);
};
이렇게 설정하면 작동한다!
나는 이 부분에서 한참을 작동하지 않았는데, 전체적인 코드를 다시 확인하고 내 잘못임을 깨달았다...🥲 (4. 진행 중 만난 이슈 - 4.2 작성)

/route/carnmap://route/car?slat=출발지위도&slng=출발지경도&sname=출발지이름&dlat=도착지위도&dlng=도착지경도&dname=도착지이름&v1lat=경유지1위도&v1lng=경유지1경도&v1name=경유지1이름&appname={YOUR_APP_NAME}v2lng, v3lng, ... , v5lng 형태로 사용이 가능하다.// 액션 경로 설정
const actionString = routeData
.map((element, idx) => {
if (idx === 0) {
return `slat=${element.lat}&slng=${element.lng}&sname=${element.title}`;
} else if (idx === routeData.length - 1) {
return `dlat=${element.lat}&dlng=${element.lng}&dname=${element.title}`;
} else {
return `v${idx}lat=${element.lat}&v${idx}lng=${element.lng}&v${idx}name=${element.title}`;
}
})
.join("&");localhost만 등록해뒀는데, 접속하는 네트워크가 등록되어 있지 않아 발생한 문제였다.분명히 코드를 잘 작성했다고 생각했는데, 아무런 동작이 없었다.
handleNaviLinkClick 내부에 console.log로 확인해도 해당 함수는 잘 작동되는 것을 확인했다.
일부 코드를 변경해도 아무런 변화가 없어서 전체적인 코드를 다시 확인하는 과정에서 나의 실수를 발견할 수 있었다.
원인 : 상단에서 const location = useLocation();으로 location 변수를 react-router-dom의 useLocation훅을 통해 정보를 가져왔던 것이다.
이렇게 되면, 전역 location 객체가 아닌 리액트 라우터에서 제공하는 정보가 할당된다... 그래서 아무런 동작이 없었던 것!
해결 : const location = useLocation();의 변수를 const curLocation = useLocation();으로 변경해줬다. 이제 이동이 잘 되는 것을 볼 수 있다.