본문 바로가기
반응형

IT 실무/모바일 프로그래밍21

[iOS] Swift에서 웹뷰로 모바일웹 띄우기(하이브리드앱 기본) class ViewController: UIViewController, WKScriptMessageHandler, WKUIDelegate { var webView: WKWebView?; var host = "모바일웹주소(http://m.naver.com/)"; override func viewDidLoad() { super.viewDidLoad() // 화면이 load되면 webview를 initialize한다. webView = initJavascriptBridge(); self.webView!.uiDelegate = self } func initJavascriptBridge()->WKWebView{ let contentController = WKUserContentController(); // 웹에서.. 2017. 5. 14.
[iOS] UIView에 있는 버튼이 클릭이 안될 때 View아래에 여러 가지 요소들을 배치 하다 보면 또 다른 UIView를 만들고 그 위에다 버튼을 배치 시킬 수도 있다. 그런데 이 UIView가 다른 요소 위에 올려놨는데 실행을 하고 보니 그 밑에 깔려 있다던가, zPosition를 조정해서 위에 보이게 해놨더니 또 클릭이 안되는 이런 일이 발생 할 수 있다. 1. 다른 요소에 가려져서 보일 경우 subView.layer.zPosition = 999; default는 0이다. 1로만 해놓아도 그 위로 올라오긴 한다. zPosition을 가진 요소가 많고, 확실히 제일 위로 올라와야 되는 경우엔 저렇게 큰 숫자로 해 주면 된다. 2. 위로 올라와 있는데 버튼이 클릭이 안될 때 self.view.bringSubView(toFront: subView); 버.. 2017. 5. 7.
[iOS] XCode Swift 환경 에서 https 사용안하고 웹뷰 띄우기 info.plist 에 다음과 같이 도메인을 추가 해 준다.개발 시엔 이대로 사용이 가능하지만 실제 마켓에 올리려고 하면 심사에서 걸려서 못 올린다. 2016년 하반기부터 https 사용이 의무화 됐다. App Transport Security Settings Exception Domains your.domain.com NSExceptionAllowsInsecureHTTPLoads YES 2017. 5. 7.
특정 색깔의 반전 색깔(반전색) 사용하기 특정 색깔이 있고, 그 색의 반대칼라를 얻고 싶다면 아래 코드를 이용하면 된다. Color reverseColor = Color.rgb(255-Color.red(bgColor), 255-Color.green(bgColor), 255-Color.blue(bgColor)); String hexColor = String.format("#%06X", (0xFFFFFF & intColor)); 2017. 5. 6.
로그캣(logcat)에서 dalvikvm 을 숨기고 싶을때 안드로이드를 디버깅 하다 보면 달빅 Virtual Machine 관련 태그로 출력되는 디버깅 메세지가 너무 많다. 물론 달빅의 디버깅 메세지가 중요한 정보를 전달 해 줄 때도 있지만 무지막지하게 뜨는 메세지 때문에 정작 내가 보고 싶은 로그가 안보인다면! ^(?!dalvikvm) 을 태그리스트에 추가하자. 좀더 깔끔한 출력을 원한다면 InputConnectionWrapper로 숨겨준다. ^(?!dalvikvm)(?!IInputConnectionWrapper) 2017. 5. 6.
안드로이드 기본 제공 Drawables(아이콘 등) 안드로이드 기본 템플릿을 생성하고 개발을 하다 보면 안드로이드에서 기본적으로 제공되는 아이콘 이미지가 어떤게 있을까 궁금할 때가 있다. 예를 들면 메뉴 예제화면에서 사용된 아이콘 말고, 내가 내 메뉴에 사용할만한 아이콘은 없을까? 하는 경우. 아래 웹사이트에서 잘 정리 해 놓았다. http://androiddrawables.com/ 아래 스크린샷처럼 버전별로 비교해 볼 수도 있다. 2017. 5. 6.
레이아웃 겹치기 android:id="@+id/FrameLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" > android:layout_width="fill_parent" android:layout_height="fill_parent" android:src="@drawable/background" /> android:id="@+id/LinearLayout1" android:layout_width="match_parent" .. 2017. 4. 30.
Uncaught Error: Error calling method on NPObject. Webview와 Native App의 연동을 위해 JavascriptInterface를 사용할때 발생할 수 있는 에러다. 1. 메서드 내에서 UI를 컨트롤 하려고 할 경우 -> runOnUIThread를 이용한다.2. 파라미터의 잘못된 사용 -> 파라미터의 형태가 맞는지, null값이 전달되진 않는지 확인한다.3. 메서드 내에서의 Exception -> 예를 들면 메서드 내에서 NullPointerException이 발생할 경우 NullPointerException이라고 보여지지 않고 제목과 같은 에러로 출력 될 수 있다. 메서드 내에서 Exception의 발생 가능성에 대해 파악해 본다. 2017. 4. 9.
하이브리드 앱에서의 세션관리(로그인 상태 유지) 100% 웹앱이라면 문제가 없다. 네이티브와 웹의 연동 없이 단순히 웹뷰만 호출하고 모든 걸 다 웹에서 처리 하겠다면 세션 걱정은 크게 하지 않아도 된다. 물론 앱과 달리 로그인이 자주 풀리긴 하겠지만 말이다. 하이브리드앱에서 세션이 문제가 되는 이유는 아래와 같다. 1. 세션은 IP단위로 유지되기 때문에 와이파이 사용 등 IP변경이 잦은 모바일 단말기는 세션이 자주 풀린다.2. 웹뷰 내부에선 세션이 있더라도 RestAPI호출시엔 그 세션정보가 없다. (다른 브라우저처럼 쿠키가 다르다) 그렇다면 각각 해결법은? 1. 세션이 아닌 다른 로그인 유지장치를 사용한다. 이를테면 preference나 sqlite같은 local DB. 또는 fcmKey 등2. CookieManager를 통한 쿠키 공유 1번만 할 .. 2017. 4. 2.
낮은 API level에서 Google Map v2 API 사용하기 개발하고 있는 어플리케이션의 Target SDK Version이 최신 버전이고, Minimum SDK Version도 꽤나 높은 버전의 안드로이드라면 API Document에 나와있는 간단한 예제 코드(https://developers.google.com/maps/documentation/android/) 만으로도 충분히 구글 맵을 구동시킬 수 있다. 하지만 구버전의 SDK 환경에서 Map을 구동시키고 싶을 경우 위 예제와 다른 방식으로 해야 하기에 구글링을 충분히 해 봐야 한다. 나도 여러 블로그 글들과 Stack Overflow의 질문/답변 참고 하였으나 사람들마다 환경도 다르고, 제시하는 방법도 달라 혼선이 있었고, 그러다 그대로 따라하기만 하면 되는 잘 정리된 글이 있어 링크 해 둔다. https.. 2013. 12. 9.
SimpleAdapter로 listView에 이미지 띄우기 그냥 SimpleAdapter는 Bitmap을 지원하지 않아서 이미지를 처리하기가 까다롭다. 다음 코드를 그대로 복사해서 ExtendedSimpleAdapter 라는 class파일로 만들고, SimpleAdapter를 ExtendedSimpleAdapter 로 바꾸어 준다. package your.pakage; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGr.. 2013. 11. 16.
[Error] Unable to open sync connection! 간단한 연결 장애 문제이다. 해결법1. 간단히 USB선을 뺐다가 꽂아 보는 것 만으로도 해결되는 경우가 많다. 전면 USB나 USB 허브를 사용할때 많이 발생하는 에러이니, 만약 여러번 뺐다가 꽂아도 해결되지 않거나 일시적으로는 해결 되는데 에러가 지속적으로 빈번하게 발생될 경우 후면 USB단자에 꽂으면 된다. 해결법2. 휴대폰의 USB 디버깅을 껐다가 킨다. 2013. 11. 16.
findViewById() 에서 String 사용하기 아래와 같이 사용하면 동작이 안된다. findViewById() 메서드에선 id만 인식하기 때문에 String변수를 적더라도 String 변수 이름에 해당하는 아이디만 찾지 그 값을 인식하지 못하는 것이다. String img = "ImageView0"+photoIndex; mPhotoImageView = (ImageView)findViewById(R.id.img); 이럴땐 아래와 같이 getIdentifier()를 이용해 줘야 한다. String img = "ImageView0"+photoIndex;int resID = getResources().getIdentifier(img, "id", "com.sample"); mPhotoImageView = (ImageView)findViewById(resID); 2013. 11. 15.
[Layout] LinearLayout 안에서 요소 오른쪽 정렬하기 중간에 View 를 넣고 layout_weight="1" 옵션을 주면 된다. Ex) LinearLayout 양쪽 끝에 버튼을 배치 하려면 아래와 같이 하면 된다. Ex) 2013. 10. 27.
[Layout] 화면 아래쪽에 요소 배치하기(align bottom) 부모가 되는 레이아웃을 RelativeLayout 으로 하고 아래쪽에 배치할 레이아웃에 android:layout_height="wrap_content" android:layout_alignParentBottom="true" 옵션 주기 Ex) 2013. 10. 27.
Fragment에서 Option Menu사용하기 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.add(0, MENU_1, Menu.NONE, "메뉴1"); menu.add(0, MENU_2, Menu.NONE, "메뉴2"); } @Override public boolean onOptionsItemSelected(MenuItem item) { Toast.makeText(getActivity(), "BB:"+item.getTitle(), Toast.LENGTH_SHORT).show(); return super.onOptionsItemSelected(item); } 2013. 5. 17.
[Error] 카메라 구동시 Crash가 일어나는 경우 (Camera -> Crop 등) 카메라 뿐만 아니다. 여타 intent를 이용한 activity 전환시 화면이 돌아가는 경우 기존 Antivity의 내용이 날아가고 새로 onCreate되는 경우가 있다. 가장 흔한 경우가 Camera를 사용할때 이다. 사진을 다 찍고 저장을 눌러서 기존 Activity로 돌아오려는 순간 Error가 발생한다. 또는 보통 Camera로 사진을 찍고 Crop툴로 이미지를 자른 후 기존 Activity로 return하는 경우가 많은데 이럴때 Camera에서 Crop으로 넘어가려는 화면에서 오류가 난다. 많은 사람들이 Crop을 불러오는 소스에서 문제가 있다고 판단하고 시간을 잡아먹지만 실제로는 카메라가 켜진 후 다시 꺼지는 과정에서 오류가 나는것이다. 여튼 이런 류의 오류는 Manifest에서 카메라를 불러.. 2013. 2. 11.
이클립스 UTF-8로 작업하기 Window - Preferences - General - Workspace 왼쪽 하단 Text file encoding 에서 Other을 선택 후 UTF-8로 설정 2013. 2. 8.
반응형