요즘 따라 포스팅이 자주 올라오죠?
 개발이 거의 끝나고, 자잘한 버그를 수정하는 중이라 그렇습니다 ㅎㅎ.
 이 버그 이외에도 몇 가지 버그와 팁 등을 발견했는데, 시간이 나는대로 포스팅하도록 하겠습니다.

 모바일 어플리케이션을 제작할 때 간혹 jQuery의 serialize메소드를 이용해야 할 경우가 있습니다. ajax를 이용하여 비동기 액션을 해야 하는 경우가 이에 해당됩니다.

 그런데 가끔가다 serialize메소드가 정상적으로 동작하지 않는 경우가 있습니다.
 이 중 가장 많이 나오는 문제는 아무런 직렬화 없이 공백 문자를 반환하는 경우이죠.

 이 경우는 원인이 너무 많아서 일일이 다 적기는 힘들고(..)
 가장 많이 하는 실수는 폼의 각 요소들에 name속성을 부여하지 않아서 생긴 문제입니다.
 대부분의 개발자들은 폼의 요소들에 id속성만 주지 name속성은 부여하지 않거든요. 하지만 jQuery의 serialize메소드를 이용하기 위해서는 반드시 name속성을 부여해 줘야 합니다.

 그리고 두 번 째 문제. 현재 JQTouch에서 가장 많이 일어나는 문제인데,
 폼 요소들 중 email타입만 직렬화가 되지 않는 경우입니다.

 
<form method="post">
        <ul class = "rounded-each">
            <li>
                 <label for="from">From</label>
                 <input type="email" id="from" name="from" autocapitalize="off"/>
            </li>
             <li>
                 <label for="to">To</label>
                 <input type="email" id="to" name="to" autocapitalize="off"/>
             </li>
             <li>
                 <label for="content">Content</label>
                 <textarea id="content" name="content"></textarea>
            </li>
            <input class="submit" id="submit" name="commit"
type="submit" value="Send" />
        </ul>
</form>

 위 폼의 경우는 content의 내용만 직렬화가 되고, from과 to의 내용은 직렬화가 되지 않습니다.

 이 문제는 사파리 브라우저(모바일, 데스크톱 포함)에서만 일어나는 문제이며, 파이어폭스 브라우저에서는 일어나지 않는 특이한 버그입니다.
 (사파리,파이어폭스를 제외한 브라우저는 잘 모르겠습니다. 아마도 webkit엔진을 사용하는 브라우저라면 비슷한 버그가 일어나겠죠?)

 해결 방법은 간단하게도, jQuery의 버전을 최신으로 업그레이드 해주시면 됩니다.
 
 이 버그가 특히나 JQTouch개발자에게 자주 일어나는 이유는 JQTouch가 최근까지 업그레이드가 되지 않고 있기 때문이죠. 개발자가 경쟁 프레임워크인 Sencha로 옮겼기 때문입니다.
 덕분에 JQTouch에 포함되어 있는 jQuery는 무려 1.3.2! 오래되도 한참 오래 된 버전이죠 ㅎㄷ.
 
 그렇기때문에 굳이 JQTouch를 사용하고 있지 않더라도, jQuery버전이 1.3.2인 분들에게도 동일한 버그가 일어날 것입니다.



Posted by 강성희 Trackback 0 : Comment 0

 
 원래는 JQTouch가 공식적으로 아이패드를 지원하지 않기 때문에, 폰갭으로 아이패드 앱을 개발하는 경우는 많지 않습니다.
 (물론 Sencha Touch가 있습니다만, 공포의 듀얼 라이센스를 감당해 낼 수 있을 때의 이야기... ㅎㄷㄷㄷ)

 하지만 폰갭으로 아이패드 앱. 정확히는 아이폰/아이패드가 동시 지원되는 앱을 만들 경우, 두 기기의 해상도에 맞는 타이틀 이미지(일명 Launch Screen)를 각각 제공해줘야 합니다.

 물론 이미지가 하나라도 알아서 리사이징을 해 줍니다만, 로딩 종료 시 순간적으로 이미지가 정상 사이즈로 보여지는 문제가 있기 때문에 가능하면 두 개의 이미지를 제공해 주는 편이 좋습니다.
 (뭐 정상 사이즈로 보여지는 그 순간이 채 1초도 되지 않으니 무시해도 되긴 합니다만...)

 해결 방법은 간단하게도, info-plist의 Launch Image(UILaunchImageFile)을 아이폰 용과 아이패드 용을 따로 나눠서 잡아주면 됩니다만(참고), 폰갭의 경우 이 부분에 관한 버그가 있어서 아이패드 용 런치 스크린이 적용이 안 될 수도 있습니다.

 이 경우 아이패드에서도 임의로 아이폰용 런치 이미지를 사용하죠. 로딩 종료시 이미지가 320px x 460px로 줄어드는 광경을 체험해 보실 수 있습니다.(머엉)

 뭐 폰갭의 버그인지 다른 이유인지를 확실히 모르겠습니다만, 해결 방법은 AppDelegate.m에 다음 코드를 추가해 주시면 됩니다.(참고)

- (void)applicationDidFinishLaunching:(UIApplication *)application
{   
    [ super applicationDidFinishLaunching:application ];
   
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        UIImage* image = [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Default-Portrait" ofType:@"png"]];
        imageView = [[UIImageView alloc] initWithImage:image];
        [image release];
       
        imageView.tag = 1;
        [window addSubview:imageView];
        [imageView release];
    }
}


 이상입니다.

 여담이지만 드디어 제가 개발한 앱이 심사에 들어갔습니다.
 빠르면 다음주, 늦어도 다다음주에는 공개가 가능할 것 같네요 ㅋㅋ.

 공개가 된다면 홍보 포스팅을 하도록 하겠습니다 ㅎㅎ.
Posted by 강성희 Trackback 0 : Comment 0

 정말 오랜만의 글이네요.

 자바스크립트로 모바일 앱을 개발할 경우 모바일의 회전에 맞춰 인터페이스를 바꿔줘야 하는 경우가 있습니다.

   이 경우 'orientationchange'라는 이벤트에 함수를 바인딩하면 모바일 기기가 회전할 때 마다 콜백 함수를 호출받을 수 있습니다.

$(window).bind('orientationchange', updateOrientation);

function updateOrientation() {
            orientation = window.innerWidth < window.innerHeight ? 'profile' : 'landscape';

            $body.removeClass('profile landscape')
                        .addClass(orientation)
                        .trigger('turn', {orientation: orientation});

            // scrollTo(0, 0);
}

JQTouch 라이브러리 내에 존재하는 코드 중 하나입니다.
기기 회전 시 HTML의 body에 'landscape'또는 'profile' 클래스를 추가하죠.


 하지만  특정 경우(특히 아이패드 환경)에서는 이 'orientationchange' 이벤트가 호출되지 않는다고 합니다.
 여러가지 원인이 있는 것 같은데, 아직 확실하게 고쳐지지 않은 것 같네요.

 이 경우에는 'orientationChanged'라는 이벤트를 이용해 보세요.

$(window).bind('orientationChanged', updateOrientation);

function updateOrientation() {
            orientation = window.innerWidth > window.innerHeight ? 'profile' : 'landscape';

            $("ul li textarea").removeClass('profile landscape')
                                      .addClass(orientation)
                                      .trigger('turn', {orientation: orientation});
  }

 단 이 이벤트의 경우 기기가 회전하기 전에 호출되는 것 같더군요.
 가령 회전 전 상태가 가로이면, 가로 상태로 함수가 호출되고 이후에 회전을 시작합니다.
 
 왠지 이벤트가 거꾸로 먹는 것 같으면 이 부분을 의심해보세요 ㅎㅎ


 - 추가(2010년 9월 16일) -
 찾아보니 JQTouch에서 제공하는 'turn'이라는 트리거가 있네요.
(http://wiki.github.com/senchalabs/jQTouch/callbackevents)
 위 코드에서도 사용하고 있었는데 전혀 눈치채지 못했네요 ^^;

 직접 사용해보진 않았지만 공식 위키에 있는 내용이니 신뢰하셔도 될 것 같습니다.
Posted by 강성희 Trackback 0 : Comment 0


Missing dependency target "PhoneGapLib (from PhoneGapLib.xcodeproj)"

cp: /javascripts/phonegap.js: No such file or directory

Command /Developer/Library/PrivateFrameworks/DevToolsCore.framework/
Resources/pbxcp failed with exit code 1
/Applications/eclipse/pg/phonegap-iphone/PhoneGapTutorial/Classes/
PhoneGapTutorialAppDelegate.h:10:0 /Applications/eclipse/pg/phonegap-
iphone/PhoneGapTutorial/Classes/PhoneGapTutorialAppDelegate.h:10:29:
error: PhoneGapDelegate.h: No such file or directory

/Applications/eclipse/pg/phonegap-iphone/PhoneGapTutorial/Classes/
PhoneGapTutorialAppDelegate.h:12:0 /Applications/eclipse/pg/phonegap-
iphone/PhoneGapTutorial/Classes/PhoneGapTutorialAppDelegate.h:12:
error: cannot find interface declaration for 'PhoneGapDelegate',
superclass of 'PhoneGapTutorialAppDelegate'

 폰갭 어플리케이션 빌드 시 다음과 흡사한 메시지가 뜨는 경우가 있습니다.
 대략 15개의 에러와 8개의 경고 메시지가 뜨며, 당연하지만 빌드는 실패합니다.

 확인 결과 인스톨러의 문제로 판명되었고, 기트허브(GitHub) 저장소에서 새로운 버전의 소스코드를 다운받아 설치하시면 해결됩니다.
 최근에는 수정판이 폰갭 홈페이지 에 올라왔으므로, 홈페이지에서 다운받으셔도 무방합니다.


 공개된지 오랜 시간이 지났지만 아직 자잘한 버그가 많네요.
 저번에도 설치 오류때문에 제대로 고생했는데... 왠만한 분들은 시작도 못 해보고 포기하게 생겼네요.
 그래도 이런 상황에서 수 많은 관련 자료와 서적까지 출간되는 걸 보면, 폰갭에 대한 기대감이 상당한 듯 싶습니다.



Posted by 강성희 Trackback 0 : Comment 0



 생각보다 일찍 번역본이 나왔네요.
 쳇, 이러면 고생하면서 원서로 읽은 보람이 없잖아... ㅡ_ㅡ

 일단 짧습니다. 원서 기준 167페이지!
 그럼에도 불구하고 필요한 내용은 거진 다 들어있습니다. 정말 굉장하죠.
 (개인적으로 쓰레기에 근접한 서적으로 평가하는 어떤 책과는 다릅니다)

 많은 분들이 폰갭 활용이 이 책의 핵심이라고 생각하시지만,
 실제로는 jQuery플러그인 중 하나인 jQTouch가 이 책의 핵심입니다.

 저 jQTouch을 통해서 지-_-랄같은 대쉬코드의 늪에서 벗어날 수 있죠.
 jQTouch를 쓰면서 내가 왜 대쉬코드 따위에 얽매였는지 후회스러울 정도입니다.(..)

 책의 기본은 웹 기반 어플리케이션 개발을 표방하는 만큼,
 처음에는 모바일 웹에서의 HTML, CSS, javascript활용에 대한 간단한 언급을 한 후,
 이후 jQuery를 활용하는 방법과, jQTouch를 이용한 좀 더 리치한 UI작성을 보여줍니다.

 이후 클라이언트에서의 데이터 저장 방법, 폰갭을 이용한 어플리케이션 배포 등등
 어플 개발을 위한 기타 몇몇가지 부분을 설명한 후 마무리.


 참 간단하면서도 필요한 것만 꼼꼼하게 설명해 주는 바람직한 서적입니다.
 왠만하면 내년 쯤 번역되었으면 했던 원서 애독자의 뜻을 이해해주지 못하다니 안타깝네요(..)

 이 책 이후에 읽어야 할 서적으로는 핵심만 골라 배우는 스마트폰 웹 개발이 있습니다.
 참고로 저는 원서로 읽을 생각이었으나 이미 번역이 되어있군요.
 원서도 참 전략적으로 읽어야겠다는 생각이 듭니다.(..)

 여하튼 좋은 책입니다. 모바일 웹&어플리케이션 개발자들은 필독!

 
IPHONEAPPS개발하기
카테고리 컴퓨터/IT > 프로그래밍/언어 > 웹프로그래밍 > HTML+JAVASCRIPT
지은이 조나단 스타크 (아이티씨, 2010년)
상세보기


Posted by 강성희 Trackback 0 : Comment 2

 폰갭에서 사용할 애플의 Push Notification Service에 관해 찾던 도중 이런 게 나왔네요.
아직 사용해 본 적은 없지만 평이 매우 좋습니다.

홈페이지는 이 곳이고, 구글 코드에서 프로젝트 정보를 살펴보실 수 있습니다.

Posted by 강성희 Trackback 0 : Comment 2


 PhoneGapLibInstaller.pkg을 실행해 폰갭을 설치하는 중에 오류가 일어날 수 있습니다.

 'Command+L' 버튼을 누르면 오류 메시지를 확인할 수 있는데, 'Phonegap PackageKit: install Failed: PKG: pre-install scripts for ...' 등의 메시지가 적혀 있을 겁니다.

 확인 결과 설치 스크립트의 라인 종료자 문제라고 하네요. 
 GitHub에 수정판이 올라와 있으니 해당 버전의 파일을 다운받아 설치하시면 정상적으로 폰갭을 설치하실 수 있습니다.

 혹여나 안 되는 경우는 XCode와 iPhoneSDK를 최신 버전으로 갱신해라. 라는 이야기가 있었는데 해 본 결과 저와는 연관이 없었네요. -_-
 하여간 이 바닥이나 저 바닥이나 다 똑같다니깐...[..]

 요즘 폰갭과 JQTouch를 이용한 아이폰 개발을 공부하고 있는데, 국내에는 자료나 커뮤니티가 없으니까 이런저런 고생이 많네요.
 혹여나 관심 있는 분들이 여럿 계시다면 전용 커뮤니티라도 하나 만들어야 될 것 같습니다.


 서적은 Building iPhone Apps with HTML, CSS, and Javascript가 제일 유명한 것 같더라구요. 살짝 훑어봤는데 내용도 참 쉽게 잘 썼고, 책도 앏은 편이라 마음이 편하고...[..]

 아마존에서는 이 책과 관련 서적 세 권을 한꺼번에 묶어서 팔더군요. 
 제 암울한 영독 능력이라면 저 세 권을 다 보기 전에 스마트폰의 패러다임이 바뀌어 버리지 않을까 합니다.[..]
Posted by 강성희 Trackback 0 : Comment 0