[Android/Kotlin] 타앱과의 연동을 위한 URL Scheme

Falco·2022년 5월 17일
0

Android

목록 보기
13/55

모바일 환경에서 타앱을 실행시키거나 또는 문자메시지에서 링크를 누르면 앱이 자동으로 실행하는 것과 같은 행동을 어떻게 할까?
외부에서 앱을 실행시킬 수 있는 방법에 대해 알아보자

Intent가 정확히 무엇일까?

startActivity(Intent(Intent.ACTION_DIAL, Uri.parse("전화번호")

지금까지는 Intent를 다른 액티비티를 실행하는 것 까지밖에 사용하지 않았었지만, Intent의 속성에 ACTION_DAIL을 넣으면 핸드폰 내부 전화기능을 사용할 수 있다.

이처럼 Intent는 명령 또는 데이터 전달수단 이다. 정확히는 애플리케이션 구성요소 간에 작업 수행을 위한 정보를 전달하는 역할을 한다. 그러면 시스템이 인텐트의 내용을 확인하고 실행한다. 인텐트를 사용하면 다른 애플리케이션의 액티비티를 띄우거나 기능을 호출할 수도 있다.

Intent(Action, Data)

로 구성된다.

명시적 인텐트와 암시적 인텐트

  • 명시적 인텐트
    는 특정 액티비티의 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상이 정확히 명시된 경우에 사용한다.
    주로 하나의 애플리케이션 내부에서 사용한다. 예를 들어 하나의 애플리케이션 내에서 특정 액티비티가 다른 액티비티 클래스를 띄우는 경우가 될 수 있다.

  • 암시적 인텐트
    암시적 인텐트는 액션과 데이터를 지정했지만 데이터를 실행할 컴포넌트가 달라질 수가 있는 경우이다. 예를 들면 ACTION_VIEW를 통해 데이터로 "http://"로 시작하는 문자열을 전달하였는데, 이를 실행할 컴포넌트(웹 브라우저)가 여러 개 있는 경우이다. 시스템이 암시적 인텐트를 받으면 데이터의 포맷을 확인한 후 적절한 컴포넌트를 찾아 실행해준다.

이러한 암시적 인텐트를 위해 사용자는
AndroidManifest.xml의 <intent-filter> 태그내에 인텐트를 실행할 컴포넌트를 추려 놓는다.

다음과 같은 얘는 ShareActivity에서 문자 전송 Intent를 사용할 것을 암시한다.

타앱의 접근을 막을려면 매니페스트에 인텐트 필터선언 X 및 파라미터 exported 특성을 "false"로 설정하면 된다.

Android Developer Intent

URL Scheme이란??

Android와 iOS 모두 사용 가능한 최초의 딥 링크 수단이다.

즉 앱의 특정 화면에 특정 데이터를 넘길 수 있다는 말


URI은 일종의 리소스를 식별하는 식별자라고 이해하면 되고 우리가 링크에서 사용하는 URL도 이 URI 안에 포함되어 있다.

타앱 및 전화 연결에 대한 URI 구조에 대한 설명은 구글링 해보면 너무 상세히 설명되어 있다.

다음은 네이버 지도에 대한 URL Scheme예제이다.
네이버 지도 앱 URL Scheme은 nmap:// 으로 시작하며, 기본 구조는 다음과 같습니다.

// 네이버 URL Scheme
val url =
"nmap://actionPath?parameter=value&appname={APP_NAME}"

val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))

// 인텐트 카테고리 브라우저를 사용해 설치된 앱 검색
intent.addCategory(Intent.CATEGORY_BROWSABLE)
val list =
packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)

// 설치되어 있지 않다면
if (list.isEmpty()) {
	// 마켓으로 이동
	this.startActivity(
			Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=com.nhn.android.nmap"))
	)
	} else {
	// URL 스킴 으로 네이버지도에서 검색
	this.startActivity(Intent(Intent.ACTION_VIEW,Uri.parse("nmap://route/public?dlat=${위도}&dlng=${경도}&dname=${이름}&appname=APP_NAME"))
	)
}
profile
강단있는 개발자가 되기위하여

0개의 댓글