Firemonkey [개발보고] 델파이 안드로이드 앱 출시 기술정보
2013.11.08 01:26
XE5 테스트겸 델파이로 안드로이드 앱 하나 출시 했습니다.
겨울 시즌을 맞아 스키관련 앱을 하나 만들어 봤습니다.
다운로드 : https://play.google.com/store/apps/details?id=com.c2design.SKI_Portal
또는 구글 play : 스키1314 검색 (무료)
[시스템구성 및 데이터처리]
대용량 데이터를 다루는것은 아니지만 Datasnap의 성능은 괜찮아보입니다.
기존 스마트폰 앱은 거의 xml 방식으로 데이터를 주고 받았는데
파싱등의 자잘한 작업에 버그도 많이 생기고 시간도 많이 걸리는 불편함이 많았죠.
Datasnap을 사용하면 클라이언트(단말기)에서 작업할 부분이 상당부분 감소되는 효과가 있습니다.
당연 개발속도도 빨라지고 오류도 적어지겠죠.
모바일 특성상 TCP 방식보다는HTTP 방식이 나아 보입니다만 구성하기 나름입니다.
날씨데이터는 기상청 공공서버에 직접 접속해서 xml로 가져오는데 3일예보 같은 경우는 데이터도 많지만 느린 이유는 공공서버 xml 구성이 불필요한 데이터가 너무 많네요.
Datasnap 서버에 관련 데이터를 미리 모아 놓고 단말기로 내려주면 해결은 됩니다. 일단 놔뒀습니다.
웹서버에서 TIdHTTP 로 스트림이나 파일 가져오는 방식은 기존윈도우 개발 방식과 똑같은 방식으로 하면 잘 됩니다.
IXMLDocument 사용해서xml 데이터 가져오는것 역시 마찬가지구요.
환경변수등 간단한 데이터는 로컬 단말기에 굳이 SQLite 사용하지않고 파일처리 하면 심플합니다.
과거에 IniFiles 많이들 써보셨을텐데..모바일 환경에서도 요긴하게 쓰입니다.
큰 차이는 없지만 속도도 더 빠르겠죠.
[화면]
화면 대부분 ListBox를 동적생성해서 사용했는데 터치시 반전 효과가 안뜨는등 약간의 문제가 좀 있습니다.
제가 방법을 모르는 것일수도 있구요.
화면 전환은 Form이 아닌Panel을 사용해서 visible TRUE/FALSE로 전환 했습니다.
좋은 방법인지는 모르겠지만 일단 잘 돌아 갑니다.
Visible TRUE/FALSE 대신 AnimateFloat 이용해서 요즘 유행하는 슬라이드 방식을 적용해도 될것 같습니다.
특히 AnimateFloat 함수는 여러모로 쓸모가 많습니다.
아날로그 온도계 바늘 돌아가는것이나 슬로프에서 리프트 오버레이 되는 기법 역시 이것으로 다 됩니다.
다만 Animation 끝나는 시간에 이벤트를 잡지 못해서 이부분은 주의해야 됩니다.
끝나는 이벤트 잡으려면 타이머을 일일이 달아줘야 하는데 불편하죠...관련함수가 추가 되기를 바랍니다.
슬로프 맵을 보여주는 화면은 2D 화면이지만 3DViewpoint를 사용했습니다.
이미지 이동과 확대 축소가 카메라 좌표와 앵글변환만으로 쉽게 처리 되기 때문입니다.
스크린 사이즈가 제각각인 안드로이드폰에 적합한 방식이 될것 같습니다.
하지만 제스쳐를 사용하는 멀티터치에 문제가 좀 있습니다.
멀티터치와 마우스 터치 이벤트를 동시에 적용하면 지멋대로 동작합니다.
따라서 Zoom과 Pan을같이 써야 하는경우 이벤트가 분리가 안되서 제대로 쓸수 없죠..
이부분은 iOS 지원했던 XE2 부터꾸준히 문제제기가 되었는데 해결이 안되고 있네요.
[하드웨어제어]
하드웨어를 콘트롤 하는 부분은 전화걸기와 네트워크 상태 체크하는 정도인데..
전화걸기는 데모소스가 나와있고 네트워크 체크하는것은 아래 게시판에 제가 올려두었던 함수를 그대로 사용했습니다.
GPS를 사용해서 본인위치를 보여주는 기능을 넣었으나 GPS만 사용하면 어플이 불안해지더군요.
메모리 누수가 좀 있는것 같습니다. 그래서 방법을 찾기 전에는 아쉽게도일단은 제외 했습니다.
이는 안드로이드 단말기 특성 일수도 있을 것 같구요…iOS에서는 비교적 잘 되는 것 같습니다.
GPS 기능이 꼭 필요한 경우 세심한 테스트가 필요해 보이네요.
[로딩]
어플 실행 시키면 화면 나올때까지 블랙스크린이 4초 정도 보입니다.
테스트 단말기는 많이 느린 갤럭시노트1 이고 갤럭시 3이후 부터는 크게 신경 안쓰일정도 입니다.
iOS 경우는 로딩중에 이미지를 보여줄수 있었으나 안드로이드는 이게안된다고 합니다.
(DavidI 에게 메일을 보내서 문의 하였더니 친절히 알려 주셨네요.)
스플래쉬 폼을 메인 폼대신 먼저 띄울수는 있으나 그렇다고 시간이 줄어드는 것은 아니구요..
메인폼 띄우기전 OnCreate 에서 많은작업을 할때는 유용할수 있을것 같습니다.
가급적 OnCreate 에서 초기작업을 하지 말고 폼생성 이후에 하는 요령이 필요 하겠습니다.
또한 어플 종료후에 곧바로 다시 실행시키면 실행이 안되고 튕기는 문제가 있습니다.
그리고 어플 띄워놓은 상태에서 화면 꺼진후에 다시 켜면 역시 블랙스크린이 뜨는 경우가 자주 있습니다.
화면이나 백버튼을 한번 터치 해주면 그제서야 어플이 켜집니다.
위 두가지 문제는 심각한 것은 아니나 사용자가 짜증날수 있으므로 해결되길 바랍니다.
[배포]
배포는 큰 문제는 없으나 릴리스 버전 생성시 매니페스트 파일에 인터넷사용 옵션을 추가해도 적용이 안되는 버그가있어 매니페스트 파일을 직접 수정해야 됩니다.
버그리스트에 올라와 있던데 이번 업데이트때 반영 되었는지는 모르겠네요.
어플 용량이 좀 큽니다. 기본폼 하나 띄워도 20MByte가 넘더군요. 이것저것 넣으면 30M는 후딱 넘어갑니다.
뭐 어쩔수 없다고 하니 감수해야 할 것 같군요. 참고로 구글 Play 앱 용량제한은 4G 로 알고 있습니다.
요즘 보니 뱅킹 같은 앱은 대부분 20M는 쉽게 넘어 가더군요.
[크로스플랫폼 및 개발환경]
iOS 버전은 약간의 화면 작업과 네트워크 체크하는 부분만 별도로작업해주면 바로 릴리스가 가능하나 iOS 버전은 이전에 테스트를 많이 해봐서 굳이 따로 배포하지는 않을 예정입니다.
개발작업시 데이터 체크 같은 것은 윈도우용으로 돌려가며 테스트하니 편합니다..컴파일이 워낙 빠르니..
다만 윈도우용으로 배포버전을 만들면 화면작업은 상당부분 별도로 해줘야 할겁니다.
특히 Listbox 같은 경우DetailText는 아예 안보이니 다르게 처리해야 합니다.
폰트크기도 제각각이고…
개발 단말기는 빠른 것 보다는 느린 것이 더 나을수 있습니다. 안보이던 버그가 잘 보입니다..^^
다만 단말기에 디버깅 걸면 좀 답답하긴하네요.
단말기 여러대 물려놓고 개발이 가능하니 상황에 맞게 작업하면 되겠죠.
앱 관련 해서 문의 사항있으면 이곳이나 파어어몽키 카페에 언제든지 질문 올려 주세요.
파이어몽키 카페 : http://cafe.naver.com/delphifmx
댓글 7
-
김나래
2013.11.08 20:52
-
c2design
2013.11.08 22:12
전화걸기 기능 때문에 "android.permission.CALL_PHONE" 옵션이 매니페스트 파일에 포함 되어 있으면 전화기능이 없는 단말기에는 다운로드가 안됩니다..단 구글 앱스토아에서만 그렇습니다.
제가 apk 메일로 보내 드렸으니 설치한번 해보세요..
-
쿠키
2013.11.14 00:27
안드로이드도 로딩시 이미지(스플래쉬) 띄울 수 있습니다.
Embarcadero Discussion Forum 참고해주시구요
(기존의 델파이에서 하던 방법으로는 되지 않습니다.)
(또한 가벼운 폼을 띄우고 나서 타이머를 이용해서
메인폼(UI가 많은)을 생성하는 방법도 스플래시 화면을 띄우는 것이아닙니다.)
델파이로 android, ios 같이 개발할 때는 UI 부분을 별개의 프로젝트로 만들어 설계하고
Controller를 만들어서 UI 를핸들링 하는게 좋은것 같습니다.
(MVC패턴 처럼)
위와같이 해야하는 이유는 , 안드로이드와 ios UI의 형태가
많이 다르고, 느낌이 달라서 각OS에 고유하게 적용해야만 우아해 보이기 때문에
하나로 해결하려했다가는 폼이나, UI가 추가될수로 낭패 볼수 있습니다.
또한, 스타일을 적용할때에도 컴파일시마다 ios적용후 컴파일 배포
android적용후 컴파일 배포 해야만 합니다.
스타일이 호환되지 않습니다.
안드로이드에서는 showmessage하고 폰이 sleep모드에 들어갔다가
나오면 showmessage 가 포커스를 잃어버려서 버튼을 누를수 없습니다. (주로 구형모델 2.3종류)
가능하면 custom messagebox를 만들어서 사용해야합니다.
(특히 쓰레드와 혼합하여 사용할때)
(아이폰은 위와 같은 증상이 어떠한 경우에도 없습니다)
특히 안드로이드는 (델파이 문제가 아님!)
이벤트 처리에 신경을 쓰야하는것 같습니다.
이벤터가 꼬이는 문제가 자주발생합니다. (아이폰은 문제가 없습니다)
(이벤트가 발생 예상 되는 시점에 다른 컨트롤을 수회 이상 터치반복하면
무한 루프에 자주 빠집니다. )
이클립스로 개발한 일반 안드로이드 어플도 이런 증상이 많습니다,
어플만들 때 컨트롤의 활성화 및 disable설정 등 세심한 코딩이 필요한것 같습니다.
-
c2design
2013.11.14 22:23
좋은 정보 감사합니다..
혹시 스플래시 이미지 띄우는 방법이 나와있는 링크좀 공유해 주시겠습니까 ?
검색해도 잘 안나오는군요..-.-
-
쿠키
2013.11.18 09:11
검색해도 잘 안보이네요
예전에 검색할 때 어떤 기준으로 했는지 잘모르겠네요...
정확한 정보를 드리지 못해서 미안합니다
제가 좀 더 검색해보고 찾으면 올려 놓겠습니다.
찾을수 없으면 따로 정리해서 예제를 올려놓겠습니다.
-
쿠키
2013.11.18 09:16
ShowMessage 띄우고 폰이 Sleep모드로 들어갔을때 다시 깨우면
버튼누르기가 되는지요?
제가 가진 갤럭시S1, 노트1 에서는 되지 않아 메시지 박스를 만들어서 사용하고 있습니다.
혹시 최신 모델의 폰에서는 되는지 이글 보시는 분들 댓글좀 달아주시면 감사하겠습니다.
테스트해보신 기기에서 동작 여부에 대한 모델명을 알려주시면 문제해결에 도움이 되겠습니다.
-
쿠키
2013.12.02 09:26
개발자 Q&A에 관련내용 올렸습니다.
정말 멋지네요! 그런데 넥서스7 에서는 다운로드가 안 되네요.. 전 넥서스7만 가지고 있어서 아쉽습니다ㅠㅠ