이 시점은 UIWebView가 deprecated 되는 상황이다. 하지만, 이 리뷰를 남기는 것은, 개발자 결제를 하지 않고, 개발을 하려고하니, WebKit 프레임 워크를 사용할 수 없었던 것 같다. 프로젝트 일정은 다가오고, 개발자 계정은 클라이언트님과 일정이 맞지 않아 개발을 먼저 하려고 하니, 사용해야 했다. 다분히 내 메모 용임을 밝혀 둔다.
스키마를 사용해서, 앱에 데이터를 전달하는 수단으로 스키마를 사용하고 있다. 스키마는 앱간의 데이터 전송이나, 앱을 동작시키는 기능까지 하는 방법이다. 따라서 OS레벨까지 동작할 가능성이 크다. 응답도 느리고, 호출순서와 응답순서가 다를 수 있다. 호출을 순차적으로 하나씩 해야 한다.
1) info.plist 에 스키마 등록 아래와 같이 URL 스키마를 등록하도록 하자. (해당 스키마로 앱이 켜지며 호출된다.).
2) 스키마를 받아 처리하는 코드.
AppDelegate 파일에 아래와 같은 메소드를 추가합니다. 이미 같은 application 메소드가 정의되어 있지만, iOS는 같은 이름이라도, 응답에 사용되는 파라메타가 틀리면 다른 메소드로 인식하기 때문에, 긴장하지 않아도 된다.
별것은 없다. 실제 안드로이드와 연동동작을 할 클래스들을 따로 모아두었다 생각하면된다. 다만 클래스 중 javascript에서 호출될 메소드는 @JavascriptInterface 어노테이션을 붙혀주면된다. 아래는 예제 소스다. (로그를 적어주는 메소드).
public class AndroidBridge {
private String TAG = "AndroidBridge";
// 로그를 띄우는 메소드 입니다. @JavascriptInterface public void call_log( final String _message ){
Log.d(TAG, _message);
}
}
2. 브릿지 셋팅하기.
MainActivity 클래스, onCreate 메소드 적당한 곳에, 적당히 셋팅해 주면된다. (그냥 클래스를 생성하고, 셋팅하는 것 뿐이다.)
AndroidBridge ab = new AndroidBridge(wv, MainActivity.this ); wv.addJavascriptInterface( ab, "Android" );
셋팅하는 addJavascriptInterface 메소드의 첫 인자는 브릿지 클래스를 바탕으로 생성한 객체, 2번째는 javascript의 어떤 객체속에 인터페이스 메소드들을 넣어줄까를 결정하는 값이다. 아래 호출 부분을 보면 쉽게 이해가 가리라 생각된다.
3. javascript 호출부분.
그냥 호출하면된다. 아래와 같이.
<javascript>
window.Android.call_log('원하는 메시지');
</javascript>
4. 안드로이드 에서 javascript로 메시지 보내기.
웹의 a 태그 href 에서 javascript를 실행할 때, <a href="javascript:alert('안녕');"> 등의 방법으로 간단히 자바 스크립트를 실행할 수 있을 것이다. 똑 같이 webview.loadUrl("javascript:alert('안녕');") 이라고 전달해 준다면, 똑 같은 동작을 한다. 다만, Webview와 Android는 비동기 상태 이므로 쓰레드로 넣어전달해 주어야 한다.
주의 할점. Handler를 넣으려고 하면, 자동완성 순서상, import java.util.logging.Handler 가 등록되며, 되지 않을 수 있다. 꼭, import android.os.Handler를 포함시키자.
javascript 속 메소드를 호출하는 코드가 있는, 클래스에 아래와 같이 Handler를 추가해 주도록 합니다.
// 웹뷰에 자바 스크립트를 사용할 수 있게 허용. wv.getSettings().setJavaScriptEnabled(true);
// 각종 알림 및 요청을 받게되는 WebViewClient를 설정합니다. (직접만든 웹뷰 클라이언트를 상속한 클래스 설정) wv.setWebViewClient(new CustomWebViewClient());
// 크롬 핸들러 설정. 이 핸들러는 자바 스크립트 대화상자, favicon, 제목과 진행상황 처리에 사용하기 위해. // WebChromeClient를 구현한 것 입니다. wv.setWebChromeClient( new WebChromeClient());
// 웹뷰에 첫 주소를 연결하도록 합니다. String first_addr = getString(R.string.first_addr); wv.loadUrl(first_addr);
// FloatingActionButton fab = findViewById(R.id.fab); // fab.setOnClickListener(new View.OnClickListener() { // @Override // public void onClick(View view) { // Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) // .setAction("Action", null).show(); // } // }); // Javascript 브릿지를 사용하도록 합니다. AndroidBridge ab = new AndroidBridge(wv, MainActivity.this ); wv.addJavascriptInterface( ab, "Android" );
}
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu);
return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId();
//noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; }
웹뷰로 인터넷에 접속하려면, 권한을 줘야 하는데, 이 것은 activity_main.xml 파일을 수정함으로써 가능하다.
<application>~~</application> 바로 아래, 아래와 같이 퍼미션을 주어 인터넷 권한 부여를 하도록 하자. 예전에는 인터넷 권한만 필요했던것 같은데, 지금은 몇가지 권한이 더 요구된다, 이 글을 보시는 분들은 구 버전을 사용해 모든 권한이 필요 없을 수 있으므로, 하나씩 단계별로 권한을 적용해 보도록 하자.
<!-- 인터넷 권한 부여 (net::ERR_CACHE_MISS) --> <uses-permissionandroid:name="android.permission.INTERNET"/>
<!-- 코드상 텍스트를 입력해 접속 가능한 url 입력 가능하게 하기. (net::ERR_CLEARTEXT_NOT_PERMITTED) --> <manifest ...> ... <application ... android:usesCleartextTraffic="true"
이 상황에서 에뮬레이터를 동작해 보면 크게 무리없이 동작을 한다는 것을 알 수 있다.
5. 웹페이지 연결.
MainActivity.java 파일을 열어, 아래와 같이 수정합니다.
웹뷰 컨트롤을 저장할 변수 선언 (MainActivity 클래스).
WebView wv;
onCreate 메소드 속 리턴 바로 위에 아래와 같이 추가하자.
// 웹뷰 컨트롤러를 가지고 옵니다. wv=(WebView)findViewById(R.id.activity_main_webview);
// 웹뷰에 데이터가 로드 될 수 있도록 합니다. wv.loadUrl("http://naver.com");
*이렇게 한뒤 안드로이드를 실행해 보면, 브라우저에서 창을 띄우게 된다. 그래서 웹뷰 클라이언트를 이용해 웹부안에서 페이지가 표시되도록 웹뷰 클라이언트 객체를 사용해야 한다. 다음 단원을 참고해 웹뷰 클라이언트를 셋팅하도록 하자.
6. 웹뷰 클라이언트 클래스 생성.
MainActivity.java 파일이 있는 패키지에, WebViewClient 클래스를 상속한 클래스를 만들어 추가하도록 합니다.
그리고, 몇줄을 Activity에 몇 줄의 설정을 더 추가합니다. 붉은 색이 추가된 것들
// 웹뷰 컨트롤러를 가지고 옵니다. wv=(WebView)findViewById(R.id.activity_main_webview);
// 웹뷰에 자바 스크립트를 사용할 수 있게 허용. wv.getSettings().setJavaScriptEnabled(true);
// 각종 알림 및 요청을 받게되는 WebViewClient를 설정합니다. (직접만든 웹뷰 클라이언트를 상속한 클래스 설정) wv.setWebViewClient(new CustomWebViewClient());
FloatingActionButtonfab=findViewById(R.id.fab); fab.setOnClickListener((view)->{ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) . setAction("Action", null).show(); });
여기까지 되었다면, 웹앱을 작업하는 데 무난 할 것 이다.
9. 추가.
각종 콜백을 받으려면, 웹뷰 크롬을 설정해 주어야 합니다. 지금은 예시로 아래 처럼 해 두지만, WebChromeClient를 상속한 서브클래스를 만들어 두면, 웹뷰의 다운로드 프로그래스등의 이벤트를 받을 수 있습니다. (상단의 웹크롬 클라이언트(.WebChromeClient )로 각종 웹뷰 콜백 받기 문서참조). 그리고 WebChromeClient를 설정해 주지 않는다면, Alert이 뜨지 않습니다. 참고해 주세요.
wv.setWebViewClient(new CustomWebViewClient()); wv.setWebChromeClient( new WebChromeClient());
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);
File dir = getCacheDir();
if (!dir.exists()) {
dir.mkdirs();
}
settings.setAppCachePath(dir.getPath());
settings.setAppCacheEnabled(true);
* 혼동하지 말 것.
안드로이드 에뮬레이터 에서 http://localhost 로 주소를 주면, 당연히 오류가 난다. 가상이지만, 하나의 피씨로 ip를 할당 받아 사용한다. 그러므로, http://localhost 해 봐야 연결되지 않는다. 당연한 이야기 같지만, 잘 혼동하므로, 주의 하자.
위 사이트에 가서, 알맞은 환경을 선택한 뒤 다운로드 받으면 된다. 몽고 DB를 다운로드 받으면, 압축이 풀리지 않은 상태로 다운로드가 되는 데, 다운로드 한뒤 더블클릭을 하면 압축이 풀어 지고, 별도의 설치과정은 필요하지 않다.
그럼에도 이 문서를 만들게 된 것은 약간의 설치 과정이 필요하기 때문이다.
이 문서는 다운로드된 파일들 속 README.txt 파일의 내용을 참고해 작성되었다.
2. 설치파일 이동 및 패스 걸기.
몽고 DB를 이동 시킬 위치 : /usr/local/mongodb
원칙적으로 어떤 폴더로 이동 시켜도 상관은 없다. 대체로 설치파일들은 /usr/local 폴더로 이동시키므로, 나도 여기에 폴더를 만들고 이동 시켰을 뿐이다.
다운로드 파일속에 /bin 폴더속에 실제 몽고DB의 유틸리티 파일들이 들어 있다. 이 파일들만 여기에 옮겨도 좋고, 다운받은 구조 그대로 /usr/local/mongodb 속으로 옮겨도 상관이 없다. 이 문서는 /usr/local/mongodb 폴더속으로 이동을 완료하였다.
이렇게 생성하고 이 폴더에서 몽고DB를 실행하면 사실상 설치는 끝이다. 하지만, 작업이 불편할 것 이므로, 패스를 걸어 주자. 자신의 홈 디렉터리 (cd ~로 이동할 수 있는 폴더)로 이동한 뒤, shift + command + .을 동시에 눌러 감춰진 파일들이 표시되도록 하면, .bash_profile 파일이 있을 것 입니다. (없으면 만들어 주면됩니다.) 이것을 편집기를 이용해 열어 줍니다.
가장 아랫줄에, export PATH=$PATH:/usr/local/mongodb/bin 라고 추가한뒤 파일을 지정합니다. (이 때 sudo 권한을 요구할 수도 있삽니다.)
터미널을 닫고 다시 연뒤 몽고db 헬프를 사용해 보도록 합니다.
$ mongod -help
몽고db 사용 설명이 표시된다면, 패스가 잘 설정된 것 입니다.
3. 실행 폴더 만들기. (/data/db)
이 부분은 readme 파일에 설명이 들어 있지 않지만, 하지 않으면, 몽고db를 실행해도, shutting down with code:100 이라는 메세지를 내며 실행되지 않습니다.
먼저 폴더를 만들어 줍니다. $ sudo mkdir -p /data/db
그리고, 권한을 줘야 하는데, 먼저 자신의 유저명을 확인합니다.
$ whoami
이렇게 해서 알게된 자신의 계정 이름을 확인해, 아래 명령어를 적절하게 써 넣어 줍니다.
$ sudo chown username /data/db
4. 몽고 db 실행.
$ mongod
이 한 줄로 몽고 DB 실행은 끝 입니다. mongod 는 데이터 베이스 이고, mongo 는 mongo db에 실제 커맨드를 날리며 실행해 보는 javasciprt sehll 입니다. 혼동하지 않도록 합니다. 여기서 몽고 db 실행이 되지 않는다면, 4번 과정이 잘 되었는지 확인해 보세요.
실행 후 웹 브라우저를 열어. http://localhost:27017 이라 입력하면, 아래와 같은 메시지를 볼 수 있습니다.
5. compass 설치
$ install_compass
이렇게 한 줄 입력하면, compass 다운로드를 시작한다. 그리고 설치 까지 마무리 된다.
6. 권한을 가진 유저만 사용할 수 있도록 설정.
처음 몽고DB를 설치하면, 누구나 DB에 접근해, 작업이 가능하다. 테스트는 문제가 없지만, 실사용에서는 권한별 사용이 가능하도록, 설정을 하고 사용해야 한다.
1) 권한가진 접속자만 허용하기 전, 계정 추가. (변경후에 사용할 관리자 계정을 하나 추가하도록 하자.).
터미널을 열어 mongo 콘솔로 접속하자.
$ mongo
터미널 프롬프트가 > 로 바뀌면 콘솔로 접속한 상태. 2줄을 입력해 관리자를 추가하자.
> use admin > db.createUser({ user:'이름', pwd: '비밀번호', role:['root']})
2) 권한 가진 접속자만 접속 허용.
주로 vim을 사용할텐데, 어떤 에디터든 상관이 없습니다. /usr/local/etc/mongod.conf 파일을 열어(없으면 생성), 아래 2줄을 추가하고 종료합니다.
코르도바는 모든 플랫폼에서 동작하는 앱을 만들어주는 개발언어 이å므로, 각 개발을 원하는 플랫폼을 따로 구축해 주어야 합니다. 안드로이드는 설치중 여러가지 문제가 발생해 (주로, 안드로이드 스튜디오 관련) 애를 먹었었습니다. 하지만 맥에서 Xcode를 설정하는 것이라 쉽게 일이 마무리 되었습니다.
2. java 설치. 환경 변수 문제로 인해 코르도바 트러블이 생길 수 있다. 최신 버전인 java 11 버전을 설치한다면, 코르도바는 java가 설치되지 않은 것으로 인식한다. 당연히 문제가 발생한다. 그러므로, 8 버전을 설치한다. (한국 번역본은 보지 않도록 한다.)
여기서 우리는 installing manually 항목대로 설치를 할 것 이다. 다운로드 페이지에서 binary-only나 complete를 다운로드 받으면된다. 맥 같은 경우 다운로드를 받으면, 바로 압축이 풀어 지므로, 그대로 지정한 폴더로 복사하면된겠다.
복사할 위치 : /opt/gradle
설치메뉴얼 처럼 한 번에 폴더가 생성되지 않는다, 대체로 아래처럼 입력하면 무난하다. (그냥 파인더로 생성해도 상관없습니다.)
$ sudo mkdir /opt $ sudo mkdir /opt/gradle
그냥 파인터를 이용해 데이터를 복제하자.
환경변수는 아래와 같이 등록합니다.
$ export PATH=$PATH:/opt/gradle/gradle-5.3.1/bin
위의 방법이 메뉴얼에 나와 있는 방법인데, 터미널을 다시켜면 환경변수가 지워졌습니다. 이것을 해결하기 위해, 유저 홈디렉토리 (cd ~로 이동할 수있는), 폴더를 파인더로 찾아가 Shift + command + . 을 동시에 눌러 감춰진 파일들이 표시되도록 하였습니다. 여기서 .bash_profile 파일을 편집기(저는 vs code를 이용했습니다.)를 열어 위의 패스를 걸어 줍니다.
안드로이드 스듀이로를 열어 tools > SDK Manager를 열어 다음 사항을 확인해 줍니다. 1) Android Platform SDK 안드로이드 버전을 확인합니다. 2) Android SDK build-tools 19 이상 혹은 최상위 버전. 3) 안드로이드 SDK가 설치된 경로, (이것을 알아야 패스를 거어 줄수 있습니다.)
환경변수 설정해 주기. 이것을 해 줘야 코르도바에서 안드로이드 관련 소스들을 찾을 수 있다. gradle 환경 변수를 설정했던 요령으로, 안드로이드를 위한 환경변수를 같은 파일에 추가해 줍니다.