2008년 2월 25일 월요일

iSokoban

그동안 미루고 미뤘던 소코반을 만들었다. 짬짬이 시간이 되는대로 작업하다 보니 시작은 오래 전에 했지만, 이제서야 기본은 된 것 같다.

아직 구현해야할 내용이 많지만...

Download


2008년 2월 21일 목요일

iPhone 한글 문제들

한글 파일명


MAC 파일 시스템은 유니코드를 지원하도록 설계되어 있다. 그러나, 한글 저장이 유니코드 영역중 완성형 영역이 아닌 조합형 한글 영역을 사용하기 때문에, 파일 시스템의 한글 파일을 그대로 출력하면 "ㅎㅏㄴㄱㅡㄹ" 형태로 보인다.

이 문제를 해결하기 위해서는 유니코드의 canonical compose 기법(?)을 사용한다. Mac에서는 NSString의 precomposedStringWithCanonicalMapping 함수를 사용하면 된다. iPhone에서도 동일하다.

한글 코드

MAC에서 사용되는 encoding이 동일하게 iPhone에서도 사용된다. 사용되는 Encoding은 http://swiki.osxdev.org/osxdev/31 에 잘 정리되어 있다.


iPhone 프로그램 패키지 구성 방법

iPhone directory 구성에서 /Application 에 프로그램들이 위치하고 있다는 것은 모두 알고 있는 사항입니다.

이 디렉토리에 어떻게 새로운 프로그램을 추가할 것인가? 그것에 대해 설명하도록 하겠습니다.

이 글에서 Launcher라고 언급한 부분은 일반적인 Program Launcher 개념이며, iPhone에서 Spring Board 라고 생각하시면 됩니다.

필요사항을 요약하면 다음과 같습니다.

  1. 적절한 디렉토리를 만든다. 예) TextReader.app
  2. 실행할 바이너리 및 기타 파일을 추가한다.
  3. Info.plist 를 작성하여 추가한다.
  4. icon.png를 추가한다.
  5. Default.png를 추가한다.
  6. 디렉토리를 포함하여 zip 파일을 만든후, Installer를 위한 설치 스크립트를 만듭니다.

디렉토리 만드는 것과 실행 바이너리 및 파일을 추가하는 것은 각 개발자가 알아서 하는 부분이니 언급하지 않겠습니다.

Info.plist 작성

이 파일은 iPhone Launcher가 프로그램에 대한 정보를 파악하기 위해 읽습니다.

다음은 TextReader의 Info.plist 파일 구성입니다. 이 부분은 기본적으로 다른 프로그램으로 복사하여 편집하여 사용하면되는데, 수정해야 할 부분은 다음과 같습니다.

CFBundleExecutable - 실행 파일 이름을 명시합니다.
CFBundleIdentifier - 다른 프로그램과 구분하기 위한 keyword입니다. 아주 중요합니다.
CFBundleName - Launcher가 화면에 출력할 때 사용되는 이름입니다.
CFBundleShortVersionString - version 정보입니다.
CFBundleVersion

"CFBundleIdentifier" 부분은 Launcher가 실제 프로그램을 식별하기 위한 keyword로 사용하는 부분입니다. 동일한 CFBundleIdentifier 를 가지는 프로그램은 동시에 실행될 수 없습니다. 그러니 개발자는 반드시 유니크한 이름을 사용하여 다른 프로그램과의 차별을 두어야 할 부분입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>TextReader</string>
<key>CFBundleIdentifier</key>
<string>com.mizi.iphone.textreader</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>TextReader</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.3.6</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.3</string>
</dict>
</plist>

icon.png 추가

Launcher가 프로그램을 화면에 표시할 때 사용할 icon입니다. 대부분 80x80 의 해상도를 가지는 아이콘을 많이 사용합니다.


Default.png 추가

iPhone은 초기 프로그램 실행시에 약간의 트릭을 사용하고 있습니다. 대부분의 사용자는 iPhone 응용 프로그램 실행시 늦게 실행된다는 느낌을 받지 못하지만, 실제로 프로그램 실행시 약 2초의 시간이 걸립니다.
iPhone은 프로그램 실행시, 프로그램 화면을 작은 화면에서 큰 화면으로 확대하는 효과를 사용하여 사용자로 하여금 지루함을 느끼지 못하도록 하고 있습니다.

Default.png는 이때 사용하는 이미지입니다. 프로그램 실행시 나타나는 화면 확대 효과는 사실 진짜 프로그램을 이용하는 것이 아닌, Default.png 를 사용하여 확대 효과를 창출하는 것입니다.
그러므로, Default.png를 잘 만들어야 사용자는 어색함을 느낄 수 없습니다.

몇몇 iPhone 예제에서는 프로그램 종료시 마지막 화면을 Default.png로 저장하는 것도 있습니다.



Installer script 작성

Installer script 작성은 옵션입니다. 이것은 없어도 그만입니다.

제가 관리하고 있는 Installer script는 다음과 같습니다.

http://touch-programs.googlecode.com/files/mizi.xml

추후 이부분을 수정토록 하겠습니다.


Respring

새롭게 추가된 프로그램 패키지는 respring 이라는 단계를 거쳐야 launcher에 표시됩니다. SysInfo 프로그램을 실행하면 첫 화면에 respring 버튼이 있습니다. 이것을 가볍게 눌러 주시면 됩니다.

이 작업은 Spring Board를 죽였다가 다시 실행시키는 것입니다.


2008년 2월 3일 일요일

iPhone HOME Directory

iphone 1.1.3 버전이 나오면서, SpringBoard의 권한이 mobile로 변경되었다.
때문에, 기존에 /var/root/가 HOME 디렉토리였지만, 이제는 /var/mobile/ 이 HOME 디렉토리가 되었다.

기존의 iphone 응용 프로그램의 대다수가 HOME 디렉토리에 대한 path가 하드코딩되어 있어, 프로그램에 직접 "/var/root/"를 사용하고 있어, 새 버전에서 호환성 문제가 발생하고 있다. 텍스트 리더도 마찬가지고...

이러한 호환성 문제를 해결하려면, 계정 정보에 따라 HOME 디렉토리를 변경하는 것이 좋은데, 일반적인 Unix 환경에서는 환경변수 $HOME 을 통해 디렉토리를 확인할 수 있지만, 확인결과 iPhone은 이 환경 변수를 기본으로 설정하고 있지 않다. (SSH로 접속하는 경우에는 설정된다. 그러나, 실제 실행환경에서는 설정되어 있지 않다.)

$HOME 말고 또, HOME 디렉토리를 표기하는 방법으로는 "~/" 가 있다. 여기서 "~" 문자가 HOME 디렉토리를 의미한다.
iPhone 에서 이 "~" 문자를 사용하면 계정에 따른 HOME 디렉토리를 정확히 설정할 수 있다. 그러나, 그냥 사용하면 안된다. 다음과 같이 사용하면 사용이 가능하다.

NSString *homeDir = [@"~/Media/TXT" stringByExpandingTildeInPath];

이렇게 사용하는 경우 1.1.2 환경에서는 "/var/root/Media/TXT" 가 되고, 1.1.3 환경에서는 "/var/mobile/Media/TXT"가 된다.