하이브리드 앱 강좌 #3. 웹브라우저형 앱

하이브리드 앱의 유형

하이브리드 앱에 대한 개념이 모호한 이유 중 하나는 하이브리드 앱이라 부를 수 있는 앱의 종류가 워낙 다양하기 때문입니다.
웹 앱을 웹뷰를 통해 네이티브 앱 속에 포장한다는 개념은 공통적이지만, 포장할 웹 앱을 가져오는 방법에 따라서 하이브리드 앱을 크게 3가지로 나누어 볼 수 있습니다.
(아래에 쓰인 용어들는 편의상 제가 자의적으로 붙인 이름입니다.)

  1. 웹브라우저형 앱
  2. 전자책형 앱
  3. 하이브리드형 앱

웹브라우저형 앱

웹브라우저형 앱은 웹브라우저처럼 매번 특정 URL에 접속해서 웹 앱(웹페이지)을 불러옵니다.
웹 앱은 자신이 개발한 웹사이트를 참조할 수도 있고, 타 웹사이트를 참조할 수도 있습니다.
네이버 모바일 페이지를 참조하는 네이버 앱이 전자에 해당합니다.

네이버 모바일

DC인사이드를 참조하는 여러 브라우저 앱들은 후자에 해당합니다(예: 하이브리드 DC).

하이브리드 DC

이런 종류의 앱은 오프라인 상태에서는 아무런 기능을 할 수 없습니다.

오프라인

심지어 제대로 코딩되지 않은 경우에는 모바일 앱이 접속하려는 웹 앱의 URL이 그대로 노출되기도 합니다.

URL 노출

애플 앱스토어 검수에서는 웹브라우저형 앱이 단지 모바일 페이지를 불러오는 것에 그칠 경우, 앱으로 만들지 말고 웹사이트의 북마크를 추가하라고 합니다.
따라서 이런 앱은 네이티브 앱에서만 사용 가능한 기능들을(푸쉬 알림, 카메라 등) 추가해야 합니다.

전자책형 앱

전자책형 앱은 앱 설치 파일 내부에 이미 htm 파일들이 포함되어 있습니다.
웹뷰를 통해 로컬 htm 파일을 불러오므로 웹 서버에 접속할 필요가 없습니다.
따라서 서버의 트래픽을 소모하지 않고, 오프라인 상태에서도 작동하고, 각 페이지를 로딩하는 시간이 짧다는 장점이 있습니다.
컨텐츠 제공을 주된 목적으로 하는 몇몇 앱들이 해당됩니다(예: jQuery Reference)

jQuery Reference

단점으로는 하나의 페이지를 업데이트 하더라도 어플을 새로이 마켓에 업로드해야 한다는 점입니다.
안드로이드 앱의 경우에는 수 시간 안에 업데이트되지만, iOS 앱의 경우에는 또 다시 검수 과정을 거쳐야 하므로 하이브리드 앱의 장점 중 하나를 잃게 됩니다.

애플 앱스토어 검수에서는 이런 앱이 단지 정해진 컨텐츠를 불러오는 것에 그칠 경우, 앱으로 만들지 말고 전자책을 만들라고 합니다.
따라서 이런 앱은 사용자와 상호작용하는 기능을 추가해야 합니다.
인터넷을 사용하지 않는 순수한 전자책형 앱은 찾기 어렵고, 대개는 상호작용 기능을 추가하기 위해 웹뷰를 통해 게시판을 보여주는 방식으로 제작됩니다.

하이브리드형 앱

하이브리드형 앱은 웹브라우저형 앱과 전자책형 앱의 장점을 결합하고 단점은 보완한 것입니다.
일부 기능들은 전자책형 앱으로 구현하고 나머지 기능들은 웹브라우저형 앱으로 구현하는 경우가 대표적입니다.
공통 자바스크립트, 이미지 파일 등은 앱 내부에서 불러오고, 나머지 컨텐츠는 웹을 통해서 가져오기도 합니다.
웹 앱에 처음 접속할 때에는 인터넷을 사용하지만, 다음부터는 캐시된 페이지를 보여주기도 합니다.

개요

이번 강좌에서는 하이브리드 앱의 유형 중 가장 단순한 웹브라우저형 앱을 제작하겠습니다.
앱의 이름은 `DC 도우미`이며, 이름대로 타 웹사이트(DC인사이드)를 참조하므로 따로 HTML, javascript 코딩은 하지 않습니다.
안드로이드 웹뷰 활용 강좌로 보아도 됩니다.

준비

앞 강좌에서 다룬 대로 이클립스에서 새 프로젝트를 생성합니다.
LinearLayout, WebView, Button을 배치하고 텍스트를 지정합니다.

레이아웃 배치

버튼 클릭 이벤트를 처리하기 위해 WebView와 Button에 id를 부여합니다.

id지정

기본 작업을 위한 소스는 다음과 같습니다.

public class MainActivity extends Activity {

	WebView webViewMain;
	Button buttonTitle, button1, button2, button3;
	OnClickListener cListener;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		webViewMain = (WebView) findViewById(R.id.webViewMain);
		buttonTitle = (Button) findViewById(R.id.buttonTitle);
		button1 = (Button) findViewById(R.id.button1);
		button2 = (Button) findViewById(R.id.button2);
		button3 = (Button) findViewById(R.id.button3);
		cListener = new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				switch (v.getId()) {
				case R.id.buttonTitle:
					buttonTitleClick();
					break;
				case R.id.button1:
					button1Click();
					break;
				case R.id.button2:
					button2Click();
					break;
				case R.id.button3:
					button3Click();
					break;
				default:
					break;
				}
			}
		};
		buttonTitle.setOnClickListener(cListener);
		button1.setOnClickListener(cListener);
		button2.setOnClickListener(cListener);
		button3.setOnClickListener(cListener);
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) { ... }

	void buttonTitleClick() { }

	void button1Click() { }

	void button2Click() { }

	void button3Click() { }
}

인터넷 퍼미션 추가

웹에 접속해야 하므로 `인터넷` 퍼미션을 사용해야 합니다.
이를 추가하기 위해서는 Project Explorer에서 AndroidManifest.xml을 더블클릭합니다.

퍼미션

Manifest 창 아래에서 Permission 탭을 선택합니다.

퍼미션

Add 버튼을 클릭합니다.

퍼미션

이 중에서 Uses Permission을 선택하고 OK를 클릭합니다.

퍼미션

Name 옆의 셀렉트 박스에서 android.permission.INTERNET 을 선택합니다.
Ctrl+S를 눌러 저장하면 반영된 것을 볼 수 있습니다.

이제 이 어플을 설치하려 하면 `네트워크 통신 – 완전한 네트워크 액세스`라는 권한이 필요하다는 메시지를 볼 수 있게 됩니다.
이러한 단계를 거치지 않은 경우, 인터넷이 되는 상황에서도 웹뷰에서는 웹페이지를 표시할 수 없다는 메시지만 나옵니다.

URL 불러오기

지금 상태에서 어플을 실행시킬 경우 웹뷰에서는 빈 화면만 볼 수 있습니다.
어플 실행이 마친 뒤에는 웹뷰에 홈페이지를 불러와야 합니다.
onCreate 메서드에 다음과 같은 코드를 추가하기만 하면 됩니다.

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		...
		
		webViewMain.loadUrl("http://http://m.dcinside.com/list.php?id=programming");
	}

WebSettings

첫실행

이제 어플을 실행하여 작동해 보면 몇 가지 이상한 점들이 눈에 뜨입니다.
우선 자바스크립트가 작동하지 않습니다.
또한 페이지 줌인/줌아웃이 작동하지 않습니다.
이러한 문제점들을 해결하기 위해서는 WebSettings를 이용해야 합니다.

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		...
		
		WebSettings webSettings = webViewMain.getSettings();
		webSettings.setJavaScriptEnabled(true);
		webSettings.setBuiltInZoomControls(true);
		webViewMain.loadUrl("http://http://m.dcinside.com/list.php?id=programming");
	}

setJavaScriptEnabled 메서드를 통해 javascript 실행을 허용할 수 있습니다.
setBuiltInZoomControls 메서드를 통해 화면 확대/축소를 허용할 수 있습니다.
그 이외에도 확대 축소를 할 때에 웹뷰 오른쪽 아래에 나타나는 돋보기 아이콘을 없애기 위해서는 setDisplayZoomControls(false)를 추가하면 됩니다.

WebViewClient 지정

현재 상태의 또 다른 문제점 중 하나는 링크를 클릭하면 웹뷰 안에서 열리지 않고 `작업을 수행할 때 사용하는 애플리케이션`을 선택하라고 하는 것입니다.

링크클릭

이러한 문제점은 WebView에 WebViewClient가 지정되어 있지 않기 때문입니다.
WebViewClient는 페이지 로딩 시작과 끝, 키입력 등의 여러 이벤트를 처리할 수 있도록 도와줍니다.
따라서 다음과 같은 코드를 추가하여 WebViewClient를 지정하면 WebView가 링크 클릭을 처리할 수 있게 됩니다.

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		...
		
		WebSettings webSettings = webViewMain.getSettings();
		webSettings.setJavaScriptEnabled(true);
		webSettings.setBuiltInZoomControls(true);
		
		webViewMain.setWebViewClient(new WebViewClient() {
			
		});
		
		webViewMain.loadUrl("http://m.dcinside.com/list.php?id=programming");
	}

WebChromeClient 지정

또 다른 문제점은 My 갤러리 메뉴를 클릭하면 `로그인 후 이용가능합니다. 로그인하시겠습니까?` 라는 대화상자가 표시되어야 하지만 아무런 반응이 없다는 것입니다.
이러한 문제점은 WebView에 WebChromeClient가 지정되어 있지 않기 때문입니다.
WebChromeClient는 dialog, favicon, title, progress를 다루도록 도와줍니다.
따라서 다음과 같은 코드를 추가하여 WebChromeClient를 지정하면 WebView가 대화상자를 출력할 수 있게 됩니다.

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		...
		
		WebSettings webSettings = webViewMain.getSettings();
		webSettings.setJavaScriptEnabled(true);
		webSettings.setBuiltInZoomControls(true);
		
		webViewMain.setWebViewClient(new WebViewClient() {
			
		});
		
		webViewMain.setWebChromeClient(new WebChromeClient() {
			
		});
		
		webViewMain.loadUrl("http://m.dcinside.com/list.php?id=programming");
	}

Back 버튼 눌러서 뒤로가기

또 다른 문제점은 Back 버튼을 누르면 곧바로 어플이 종료된다는 점입니다.
onBackPressed 메서드를 재정의하여 webViewMain에서 뒤로가기가 가능할 경우 어플을 종료하지 않고 웹페이지 뒤로가기 기능을 실행하도록 하겠습니다.
메서드를 재정의할 때에는 직접 타이핑하는 것이 아니라 적절한 위치에 커서를 위치하고 Alt+Shift+S를 누르면 다음과 같은 컨텍스트 메뉴가 나옵니다.

자동완성 메뉴

여기에서 Override/Implement Methods 메뉴를 선택하면 다음과 같은 창이 나옵니다.

메서드 재정의 또는 구현

목록에서 onBackPressed를 선택하고 OK 버튼을 클릭하면 커서가 있던 위치에 다음과 같은 소스가 자동삽입됩니다.

public class MainActivity extends Activity {
	...

	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		super.onBackPressed();
	}

	...
}

앞에서 말한 기능을 구현하기 위해서는 onBackPressed 메서드 안에 다음과 같이 코드를 수정/추가하면 됩니다.

public class MainActivity extends Activity {
	...

	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		//super.onBackPressed();
		if (webViewMain.canGoBack()) {
			webViewMain.goBack();
		} else {
			finish();
		}
	}

	...
}

액션바 숨기기

또 다른 불편한 점은 불필요한 액션바가 큰 공간을 차지하고 있다는 것입니다.
이것은 어플의 테마를 수정하여 해결할 수 있습니다.
AndroidManifest.xml 파일을 연 뒤, Application 탭을 선택합니다.

테마 설정

Theme 옆의 Browse 버튼을 클릭합니다.

테마 설정

Resource Chooser 창에서 System Resources를 선택하고, 텍스트칸에 theme.light.not 정도를 입력하면 `Theme.Light.NoTitleBar`가 보입니다.
선택하고 OK 버튼을 누른 뒤 Ctrl+S를 눌러 저장하고 실행하면 다음과 같은 결과를 얻을 수 있습니다.

테마 설정

로딩 관련 처리

링크를 클릭하여 웹뷰에서 로딩이 시작되면 상단 버튼의 텍스트를 `로딩 중…`으로 바꾸고, 로딩이 완료되면 해당 웹페이지의 타이틀을 상단 버튼의 텍스트로 지정합니다.
이를 위해서는 앞서 웹뷰에 지정한 WebViewClient의 소스를 수정해야 합니다.
onCreate 메서드에서 다음과 같이 되어 있었던 원래의 소스에서,

		webViewMain.setWebViewClient(new WebViewClient() {

		});

자동완성 기능을 이용하여 onPageStarted, onPageFinished 메서드를 추가해서 다음과 같이 수정합니다.

		webViewMain.setWebViewClient(new WebViewClient() {

			@Override
			public void onPageStarted(WebView view, String url, Bitmap favicon) {
				// TODO Auto-generated method stub
				super.onPageStarted(view, url, favicon);
			}
			
			@Override
			public void onPageFinished(WebView view, String url) {
				// TODO Auto-generated method stub
				super.onPageFinished(view, url);
			}
			
		});

onPageStarted 메서드에서는 상단 버튼의 텍스트를 `로딩 중…`으로 변경합니다.

			@Override
			public void onPageStarted(WebView view, String url, Bitmap favicon) {
				// TODO Auto-generated method stub
				super.onPageStarted(view, url, favicon);
				buttonTitle.setText("로딩 중...");
			}

onPageFinished 메서드에서는 상단 버튼의 텍스트를 웹뷰에 로딩된 페이지의 타이틀로 변경합니다.

			@Override
			public void onPageFinished(WebView view, String url) {
				// TODO Auto-generated method stub
				super.onPageFinished(view, url);
				buttonTitle.setText(webViewMain.getTitle());
			}

버튼 클릭 이벤트 처리

글쓰기 버튼은 button2이고, 앞에서 이를 클릭하면 button2Click 메서드가 실행되도록 코딩했습니다.
이 버튼을 클릭하면 글쓰기 링크로 연결되도록 합니다.
방법은 onCreate에서 홈페이지를 불러올 때와 동일합니다.

	void button2Click() {
		webViewMain.loadUrl("http://m.dcinside.com/write.php?id=programming&mode=write");
	}

새로고침 버튼은 button3이고, 앞에서 이를 클릭하면 button3Click 메서드가 실행되도록 코딩했습니다.
이 버튼을 클릭하면 자바스크립트 함수를 호출해야 합니다.
loadUrl 메서드를 사용한다는 점은 동일하지만, 앞에 `javascript:`를 붙여야 한다는 점이 다릅니다.

	void button3Click() {
		webViewMain.loadUrl("javascript:location.reload();");
	}

이를 응용하면 메시지 창을 띄우거나, 특정 element의 스타일을 변경하는 작업이 가능합니다.
예를 들어 button1Click 메서드를 다음과 같이 코딩하고 실행한 뒤 button1을 클릭하면 다음과 같이 특정 div를 감출 수 있습니다.

	void button1Click() {
		webViewMain.loadUrl("javascript:document.getElementsByTagName('div')[2].style.display='none';");
	}

실행 후 버튼을 클릭한 결과는 다음과 같습니다.

javascript 실행

이런 방법은 무궁무진하게 활용될 수 있지만, 이를 자세히 다루는 것은 본 강좌의 범위를 벗어납니다.
보다 자세한 내용을 알기 위해서는 HTML5, CSS, jQuery 등에 관한 좋은 강좌들을 참고하세요.

이런 과정으로 작성된 어플은 다음 링크에서 설치할 수 있습니다(구글 플레이 스토어).

DC 도우미

이상으로 웹브라우저형 하이브리드 앱 개발에 대해 예제를 통해 간단히 다루어 보았습니다.
다음 강좌에서는 전자책형 하이브리드 앱 개발 방법을 다루겠습니다.

관련 포스트

문자 메시지를 훔쳐보는 어플 찾기 – Permission Friendly Apps

이번 포스팅의 부제는 왜 그들은 스마트폰 메신저에 집착하는가? 입니다.

이번 글에서는 스마트폰의 보안 문제 중 사생활 침해를 중점적으로 다룹니다.

개인정보 유출에 관해서는 그 동안 여러 사건이 있었고, 뉴스를 통해 이 문제에 관심을 갖는 사람들이 많아졌지만, 아직까지 사생활 침해에 대해서는 인식이 부족한 것이 현실입니다. 앞으로 사생활 침해가 진지하게 논의되는 사회 분위기가 조성되기를 기대하면서 이 글을 씁니다.

카카오톡을 아시나요? 스마트폰을 사면 기본적으로 설치하는 어플 중 하나고, 전세계적으로 5,000만명 이상의 사용자가 있습니다. 2012년 9월말 시점에서, 네이버에서 `카카오톡`으로 검색하면 약 22,000개의 기사가 검색됩니다. `LG 옵티머스`로 검색을 하면 약 24,000여개의 기사가 검색되는 것과 비교해 보면 카카오톡은 하나의 스마트폰 라인업과 맞먹는 인지도를 가지고 있다고 볼 수 있습니다. 사실상 대한민국 사람 중 카카오톡을 모르는 사람은 찾아보기 힘들 정도입니다.

카카오톡이 성공하자 네이버, 다음, 네이트 등의 포털에서 카카오톡과 유사한 서비스를 제공하는 어플을 새로 개발하거나, 혹은 기존의 어플을 적극적으로 홍보하는 모습을 흔히 볼 수 있게 되었습니다. 네이버 라인, 마이피플, 네이트온UC 등도 잘 알려져 있는 스마트폰 메신저 어플들입니다.

이렇게 여러 회사에서 많은 개발비, 서버운영비, 홍보비 등을 들여서까지 스마트폰용 `무료` 메신저를 개발하고 점유율을 높이려 하는 이유가 무엇일까요? 물론 가장 큰 이유는 모바일 환경에서 메신저를 점유하게 되면 얻을 수 있는 파급 효과가 크기 때문일 것입니다. 그러나 그 이면에는 사생활 침해를 비롯하여 다른 여러 가지 이유가 있을 수 있고, 이에 대해서 이야기하려 합니다.

사실 카카오톡에서 사생활 침해가 문제가 된 적이 없었던 것은 아닙니다. 오히려 카카오톡 대화내용이 저장되는 것을 사생활 침해 관점에서 문제 삼는 기사를 종종 볼 수 있었습니다.

카카오톡이 ‘빅 브라더’를 꿈꾼다? (디지털데일리, 2011.05.27)

이에 대해 카카오톡에서는 적극적으로 해명하고 있습니다.

카카오톡 “사생활 침해논란 억울하다” (파이낸셜뉴스, 2011.05.27)

그러나 카카오톡의 해명이 사실이라고 하더라도, 직접 대화창 나가기를 하기 전 1달 동안의 대화 내용은 카카오톡 서버에 저장되어 있기 때문에, 중요한 정보는 카카오톡을 통해서 보내기가 꺼려지는 것이 사실입니다. 계좌번호나 비밀번호 등을 알려주어야 하는 경우에도 카카오톡 대신 문자 메시지로 보내곤 했습니다.

그러나 이제는 굳이 그럴 필요가 없을 수 있습니다. 다시 말해, SMS로 전송된 메시지도 카카오톡이 받아볼 수 있기 때문입니다.

내 스마트폰에 설치된 카카오톡이 어떤 권한을 사용하고 있는지 확인해 봅시다.

시스템 설정 – 애플리케이션 – 카카오톡에 들어가 보면 다음과 같은 권한을 확인할 수 있습니다.

개인정보: 주소록 수정, 주소록 읽기, 통화기록 쓰기, 통화 기록 읽기
요금이 부과되는 서비스: 전화번호 자동 연결
위치: 대략적인 위치, 정확한 위치
메시지: 문자 메시지 받기(SMS)

이 중에서 눈에 띄는 권한이 하나 있습니다. 바로 `문자 메시지 받기(SMS)` 입니다. 이 권한이 어떤 의미인지를 확인하기 위해서는 뒤에서 소개할 어플인 Permission Friendly Apps를 통해서 확인해 봅시다.

화면이 잘 안 보이시는 분들을 위해 다시 한 번 써 보겠습니다

문자 메시지 받기(SMS)
android.permission.RECEIVE_SMS
앱이 SMS 메시지를 수신하고 처리할 수 있도록 허용합니다. 이는 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 모니터링 또는 삭제할 수도 있다는 것을 의미합니다.

다시 말하면 제 핸드폰으로 전송되는 모든 메시지들을 카카오톡이 읽어볼 수 있다는 뜻입니다. 도대체 왜 카카오톡이 제 문자 메시지를 읽어야 하는 건가요?

물론 문자 메시지 받기 기능이 나름대로 쓰이는 부분이 있습니다. 바로 처음 카카오톡을 설치한 이후에 문자 메시지로 핸드폰 번호를 인증하는 부분입니다. 문자 메시지로 인증 번호가 도착하면 자동으로 인증번호를 인식해서 인증번호 칸에 입력해 줍니다. 문자 메시지로 전송된 인증번호 4자리 숫자를 입력하는 것이 귀찮을까 봐 제 대신 문자 메시지까지 확인해주시는 카카오톡 회사의 배려가 너무나 감사해서 눈물이 날 정도입니다.

카카오톡이 정말로 딱 한 번 필요한 인증번호 입력을 대신해주고자 하는 순수한 의도로 문자 메시지를 읽는 것일까요? 아니면 다른 의도가 있는 것은 아닐까요? 판단은 여러분들의 몫입니다.

여기까지 읽으셨다면 문자 메시지 훔쳐보는 나쁜 카카오톡 OUT 더 이상은 NAVER~ 라고 생각하실 분들이 있을 수 있습니다. 하지만 안타까운 사실은 이러한 문자 메시지 받기 권한을 사용하는 메신저가 카카오톡 뿐만이 아니라는 점입니다. 국내 유명 메신저들인 네이버 라인, 마이피플, 네이트온UC, 챗온 등의 메신저가 문자 메시지 받기 권한을 사용하고 있습니다. 해외 메신저의 경우에도 와츠앱과 페이스북 메신저의 경우에도 문자 메시지 받기 권한을 사용합니다.

대안은 없는 것일까요? 다행히도 중소규모의 메신저들의 경우에는 문자 메시지 받기 권한을 요구하지 않습니다. 틱톡이 대표적입니다. 틱톡의 권한을 확인해 볼까요?

문자 메시지 받기 권한은 없네요. 감사해야 할 지경입니다. 그러나 틱톡이 언젠가 점유율이 커진 이후에도 문자 메시지 받기 권한을 요구하지 않으리라는 장담은 할 수 없습니다.

이러한 현상을 보고 있으면 우후죽순으로 난립했었던 웹하드들을 보는 것 같습니다. 영화, 게임, 유틸리티 들을 다운받을 수 있는 `무료` 다운로드 쿠폰을 통해 홍보했지만, 결국 우리에게 돌아온 것은 어디로 노출되었는지 모르는 제 개인정보, 그리고 파일 다운로드 중이 아닐 때에도 제 컴퓨터를 갉아먹는 악성코드였습니다. 다음은 이와 관련된 최근 기사의 링크입니다.

P2P 무료영화 함부로 다운받지 마세요 (헤럴드경제, 2012.06.04)

PC에서 모바일로 IT의 대세가 바뀌어 가면서 웹하드가 `무료` 메신저로 대치되고 있다는 느낌을 지울 수가 없습니다. IT 시대의 전염병과 같은 느낌입니다. 사용자 입장에서 주의가 필요합니다.

사생활 침해를 피하는 데에 도움이 될 수 있는 어플을 소개합니다. 어플의 이름은 Permission Friendly Apps입니다. 안드로이드 플레이 스토어에서 Permission Friendly Apps를 검색해서 설치합니다. 무료인데다 아무런 권한을 요구하지 않습니다. 스마트폰에서는 다음 링크로 접속하면 됩니다.

Permission Friendly Apps

설치하고 실행하면 위와 같은 화면이 나옵니다. Go 버튼을 클릭하면 메인 화면으로 넘어갑니다.

스마트폰에 설치된 어플 목록을 보여주고, 어플별로 요구하는 권한에 점수를 매겨서 점수가 높은 순서대로 나열해서 보여줍니다. 제 스마트폰에 설치된 어플 중에서는 네이버 라인이 가장 많은 권한을 요구하고 있음을 알 수 있습니다. 카카오톡과 마이피플도 비슷한 수준입니다.

이 화면에서 우측 상단의 깔대기 모양 버튼을 클릭하면 권한을 선택할 수 있습니다. 따라서 특정 권한을 요구하는 어플을 검색할 수 있습니다.

문자 메시지 받기(SMS)를 선택해 봅시다.

제 스마트폰으로 전송되는 모든 문자 메시지를 읽을 수 있는 어플들의 목록이 나옵니다.

네이버 라인, 카카오톡, 마이피플, 네이버 밴드 등의 어플들이 있습니다. 항목을 선택하면 보다 자세히 알 수 있고, Uninstall 버튼을 클릭해서 삭제할 수도 있습니다.

저는 특정 회사를 편들거나, 특정 어플을 홍보하기 위해서 이 글을 쓴 것이 아닙니다. 이런 심각한 상황에 대해 너무나 관심이 없는 현실을 바꾸어 보고자 하는 것입니다. 스마트폰 어플 메신저들은 무료이지만 절대 공짜가 아니라는 점을 알고 사용합시다.

관련 포스트