https://play.google.com/store/apps/details?id=net.im8.mobile.android&referrer=utm_source%3Dzisource%26utm_medium%3Dzimedium%26utm_term%3Dziterm%26utm_content%3Dzicontent%26utm_campaign%3Dziname

test

iumsocius://im8/

Wednesday, March 8th, 2017, iOS

commit state loss 에 관해

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

onSaveInstanceState()가 호출된 이후에 FragmentTransaction을 commit하면 해당문제가 발생한다.
안드로이드는 메모리 확보를 위해 언제든 프로세스를 종료시킬 수 있고 background activities도 종료될 수있다.
이렇게 갑자기 종료됨으로써 발생하는 에러상황을 방지하기 위해서 framework는 각 activity에 onSaveInstanceState()를 호출해서 갑자기 종료되기전의 상태를 저장할 수있게한다. 이 저장된 상태가 나중에 복구될때 유저는 종료됬다가 다시 켜졌는지 알 수 없게된다.

onSaveInstanceState()를 호출할 때 Bundle object를 보내서 그것으로 상태를 저장할 수 있게한다. 그러면 Activity는 dialogs, fragments, views 등의 상태를 저장하며, 이것으로 추후에 복원한다.

그럼 문제가 발생하는 시점은, onSaveInstanceState()가 호출되고나서 FragmentTransaction#commit()이 호출되어, activity의 상태가 정상적으로 기록되지 못한채 transaction이 일어날때이다. 유저입장에서 보면, UI상태가 loss된걸로 보일 수 있다.

Honeycomb 이전 : onSaveInstanceState()가 onPause() 직전에 호출됨
Honeycomb 이후 : onSaveInstanceState()가 onStop() 직전에 호출됨

따라서 onPause()와 onStop()사이에 commit이 이뤄지면 pre-Honeycomb에서는 state loss가 발생한다.
onStop() 이후에 commit 하면 허니콤 이전/이후 버전 모두에서 Exception이 발생한다.

Exception을 막기 위해서는

1. onCreate에서 transaction을 commit하자
2. onCreate에서 할 수 없다면, FragmentActivity#onResumeFragments() 나 Activity#onPostResume() 에서 하자
(onPostResume()은 확실히 state가 restore 된 후 임을 보장한다.
*Activity : onActivityResult() -> onResume() -> onPostResume() 순서이며
onPostResume에서 Fragment : onResume()을 호출하므로 Fragment의 onResume에서는 괜찮다.
따라서 onPostResume 앞단계에서 commit이 일어나야함을 감지하면 flag를 사용해서 정보를 담아놓고 onPostResume에서 commit하면 된다. )
3. Asynchronous callback methods에서 commit하지 말자. 꼭 써야한다면 commitAllowingStateLoss()를 써야하지만 쓰지 않는 것이 좋다.

원글 : http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

Monday, February 20th, 2017, Android

if your app and your libraries have all been built with a new JDK (7+) and you are still getting this, then you can fix this problem by telling Proguard to keep the enclosing method attribute. Just add the following to your Proguard rules:

-keepattributes EnclosingMethod

http://stackoverflow.com/questions/3308010/what-is-the-ignoring-innerclasses-attribute-warning-output-during-compilation

Wednesday, October 19th, 2016, Android
    메인
    이음

    내프로필
    내프로필 수정
    무제한정기권
    더많은 매칭
    내가선택한매칭
    큐레이터매칭
    어게인
    지인매칭 방지권
    맺음
    인터뷰
    에잇레터
    스토어
    카카오
    이벤트
    큐레이터메시지
    에잇초이스
    세팅
    비번 변경
    Open this page in our app!
    아이템 구매 이후

Friday, October 7th, 2016, iOS

Friday, February 19th, 2016, Music

http://gunnariauvinen.com/getting-es6-syntax-highlighting-in-sublime-text/

Sublime Text에서 Syntax Highlighting이 깨지는 경우,

1. cmd + shift + p로 Command Palete… 를 연다.
2. install을 입력해 Package Control: Install Package를 선택한다.
3. Babel을 선택해서 install한다.
4. Syntax Highlighting이 깨지는 파일을 열어 View > Syntax > Open all with current extension as… > Babel > JavaScript (Babel) 을 선택한다.

 

Friday, February 19th, 2016, Tips

1. 특정 repository에서 유저이름, 이메일 등을 설정할 때 해당 repository의 root에서 입력
2. global로 사용하고 싶은 경우

git config user.name "name"
git config --global user.name "name"
Tuesday, August 11th, 2015, Tips

지난해 10월 트위터에서 Fabric (모듈형 모바일 플랫폼)을 론칭하며 이 내용을 홍보하고자 올해 1월~6월까지 월드 투어를 하는 중이었어요!
이에관한 내용은 아래 블로그에 있구요
https://blog.twitter.com/ko/2014/introducing-fabric-kr

이 플랫폼들은 본인들이 개발하면서 필요한것을 만들면서 점차 공개하기 시작해서 자신들도 실제로쓰고 있다고 하더라구요.
좋은 모바일 앱을 개발할 수있도록 필요한 항목들을 잘 사용하기 위해서 아래와같이 툴들을 만들었답니다.
그리고 이 툴들은 모두 Free라고 강조하더라구요 (twitter를 사용해서 자신의 앱을 광고하고자할때 일부의 경우빼고요)

Stability – Crashlytics
Testing – Beta
Analytics – Answers
Identity – Digits
Growth – Twitterkit
Revenew – Mopub

Crashlytics
크래시와 그 외에도 퍼포먼스에 영향을 주는 이슈들도 보여줍니다. (웹 대시보드와 메일로)
오리엔테이션은 뭐였는지 등등 알수있고 유저의 ID email등을 같이 전송해서 누구에게 크래시가 생겼는지도 알수있습니다.
Hipchat, Gitlap Trello등으로도 자동 보고가 되도록 할 수 있고 크리티컬한 정도를 조절해서 보고할수있도록할 수 있습니다.

Beta
Test할수있는 그룹들에게 빌드를 바로 바로 테스트할수있게 넘겨주는기능입니다.
어떤사람이 설치를 했는지 실제 실행해봤는지 테스트를 얼마동안진행했는지 등등을 알 수있습니다.

Answers
실시간으로 모니터할 수 있고, 빌드버전별로 크래시율을 비교할 수도있습니다. 이슈를 놓치지 않기위해 메일로 매일 리포트해줍니다.
평소보다 좀 더 차이가나기 시작하면 주황색글씨 또는 그래프에 주황색동그라미로 눈에띄도록 보여줍니다.

Digits
SNS인증이 유행을하다가 SNS종류도 너무많아지고 정보가 넘어가는 문제때문에 결국 모든 모바일폰 유저가 가지고있는 전화번호로 인증을 생각했다고합니다.
컬러나 버튼등을 약간 커스텀할수있는 UI와 SMS메세지를 전송하는 인프라를 직접 구축하여 제공합니다, 온세계 모두 된다고 보면된답니다.(메세지 현지화도 제공된대요, 제 폰으로 테스트해봤을때는 실패했어요ㅠ_ㅠ. 미국번호로 시연해주었어요)
전화번호를 통해서 양방향으로 친구찾기등의 기능도 있대요
2주쯤전엔가는 사용자가 더 보안을 강화하길원할경우에 2단계인증도 선택할수있도록 하는걸 개발했다고 하고요

Twitterkit
트위터로 로그인하기
트위터로 글 작성하기
트윗을 임베디드하기
rest api 등을 지원한다고 합니당,,
원래 rest api로 되던것들을 더 편하게 개발할수있도록 킷을 제공하는거같아요

*트위터로 마케팅하기 (글공유하게해서 팔로워들로 전파되도록 하는것도 설명해줫어요)
유료로 하는것도 있는데 트위터카드에 바로 앱을 인스톨하게하는기능같은 것이 일부있었어요. 그게아니어도 버튼눌러 링크보내기등은 무료로되니 이렇게 홍보해라 이런내용이었습니다.
또 트위터링크를 통해 설치한 횟수 / 영향력을 미친 트위터유저 등등을 fabric에서 파악할수있어요

Mopub
배너 / 풀스크린 / 비디오 / native에 껴넣는 방식 등등으로 광고를 보낼수있대요~
광고내용은 직접광고, ad network, Mopub marketplace의 광고 모두 가능하다고합니다
어느지점에 광고를 넣는게 좋은지 등을 fabric에서 확인할수있고 광고 빈도같은것도 설정할수있대요
자세한 내용은 위의 블로그나 아래 공식사이트를 참고해주세요

https://get.fabric.io/

fabric 사용예제
https://github.com/twitterdev/cannonball-ios
https://github.com/twitterdev/cannonball-android

Friday, May 8th, 2015, Tips

nib파일 작성시 iOS6에서는 navigation bar가 끝나는 영역부터, iOS7에서는 navigation bar를 포함하는 영역부터 뷰가 작성된다.
이 때 autolayout을 사용하는 경우 최상단의 subview의 상단 constraint를 IBOutlet으로 설정하고, ios6의 경우 이를 64px 줄여주면 호환을 쉽게 해결할 수 있다.

Sunday, February 8th, 2015, iOS

input 태그내의 검색어를 입력하면, 그 하단에 자동으로 뜨는 선택지 리스트를 보고 선택하고 싶은 경우 typeahead를 사용하면 된다

선택지 리스트를 로컬의 데이터가 아닌 서버에서 가져와야 하는 경우

<input type="text" ng-model="" typeahead="item for item in searchItem($viewValue)">

와 같이 함수를 사용하면 $scope내의 search()함수에 input값을 넘겨줄 수 있다

해당함수에서 결과값을 return해주면 되는데, get방식을 사용할 경우에는 jsonp를 사용할 수있다

또한 보여지는 수를 제한하기위해서는 limitToFilter(데이터, 수) 와 같은 형태로 리턴한다
요청시에 아래와같이 callback=JSON_CALLBACK를 인자로 넘겨줘야한다

$scope.searchItem = function(item) {
  return $http.jsonp('REQUEST_URL?callback=JSON_CALLBACK&filter='+item).then(function(response){
    return limitToFilter(response.data, 15);
  });
};

하지만 이것은 동기방식이므로 비동기방식을 사용하고 싶다면, input 값이 변할때마다 메서드를 콜하게 하는 방법이있다.

<input type="text" ng-model="ng-model명" data-typeahead-wait-ms="200" data-typeahead="item in selectList">
$scope.$watch('ng-model명', function(val) {
  // selectList를 리턴받을 메서드를 호출
});

* 주의 : angularjs v1.2.0 위의 버전에서는 한글입력이 버퍼에 들어가는동안 input값의 변경을 인지하지 못한다
textInputType 메서드안의 listener의 if (composing) return; 부분을 임시적으로 주석처리하면 입력을 받는다

Thursday, October 16th, 2014, Web