종종 앱을 사용하다보면 다른 앱으로 이동하는 경우가 있습니다. URL Scheme를 이용하면 정말 쉽게 구현이 가능합니다. 구현 방법에 대해 알아보고 끝에 좌표값을 가지고 구글맵과 카카오맵을 띄우면서 그 장소로 이동하는 것을 한번 정리해보겠습니다.
URL Scheme란 무엇일까요? 우리가 인터넷에 주소를 입력하면 앞에 붙는 https:// 이 부분이 바로 웹의 스키마입니다. 스키마는 https:// 만 있는것이 아닙니다.
이 사진은 크롬 설정창의 주소입니다. 맨 앞에 https:// 이 아니라 chrome:// 라고 적혀있죠? 이 뜻은 '웹사이트가 아닌 chrome에 직접 요청을 보냈다.' 라는 뜻입니다. 그럼 앱으로 한번 접근해보면 대충 상상이 가시나요? 스키마 자리에 URL Scheme를 지원하는 어떤 앱이 들어가면 해당 앱으로 요청을 보내 해당 앱을 실행시키게 됩니다.
웹사이트로 요청 -> https://
크롬으로 요청 -> chrome://
어떤 앱으로 요청 -> myApp://
이런 형태가 되는 것입니다.
Defining a custom URL scheme for your app 문서를 보면 URL Scheme를 사용할 때 주의할 점을 알려주는데
'모든 URL 매개변수의 유효성을 검사하고 잘못된 URL은 모두 삭제해야 합니다. 또한 사용자 데이터를 위험에 빠뜨리지 않는 작업으로 사용 가능한 작업을 제한합니다. URL 처리 코드를 테스트할 때 테스트 케이스에 형식이 잘못된 URL이 포함되어 있는지 확인하십시오.'
한마디로 '사용자 데이터와 같은 민감한 정보를 포함하지 말고 사용이 가능한 URL인지 확인해라' 이렇게 정리할 수 있을 거 같습니다.
자 이제 주의할 점을 알았으니 어떻게 사용하는지 코드로 알아봅시다.
if UIApplication.shared.canOpenURL(url){
UIApplication.shared.open(url, options: [:], completionHandler: nil)
} else {
print("error")
}
끝입니다. 생각보다 너무 간단하죠?
먼저 canOpenURL으로 사용하려는 url이 정상인지 확인을 하고, 사용 가능하면 UIApplication.shared.open을 사용해서 해당 앱으로 연결시킵니다.
제가 프로젝트에서 진행했던 내용입니다. URL Scheme랑 같이 보면 좋을거 같아서 정리해보려합니다.
우선 구글맵부터 한번 볼까요? iOS용 Google 지도 URL 스키마 에 모든것이 적혀있습니다. 친절하게 예제 코드도 있네요.
let url = URL(string: "comgooglemaps://?center=\(latitude),\(longitude)&zoom=17&mapmode=standard")
if UIApplication.shared.canOpenURL(URL(string:"comgooglemaps://")!){
UIApplication.shared.open(url!, options: [:], completionHandler: nil)
} else {
print("can't use google map")
}
구글맵은 지도를 표시하는데 있어 필요한 매개변수를 사용해서 다양하게 표시할 수 있습니다.
자 구글맵을 봤으니 이제 카카오맵을 한번 보겠습니다. Kakao Maps API 카카오맵도 정리가 아주 잘 되어 있습니다.
let url = URL(string: "kakaomap://look?p=\(latitude),\(longitude)")
if UIApplication.shared.canOpenURL(URL(string:"kakaomap://")!){
UIApplication.shared.open(url!, options: [:], completionHandler: nil)
} else {
print("can't use kakao map")
}
이 코드는 단순히 카카오맵과 구글맵을 띄우고 좌표값으로 이동시키는 코드입니다. 이 기능 말고도 길찾기, 검색하기, 경로표시 등 다양한 기능들이 있으니 필요하다면 문서를 통해 구현하시면 됩니다!
저 코드를 실행시키면 아마 실행이 안될겁니다. 아직 한 단계가 더 남았거든요. canOpenURL(_:) 문서를 보면 canOpenURL을 사용하려면 이 메서드에 전달할 URL을 따로 앱 파일에 키를 추가해줘야 합니다.
info.plist 에 이렇게 추가해주시면 됩니다 !