プログラマでありたい

おっさんになっても、プログラマでありつづけたい

iPhone/iPadアプリを多言語対応する

 自作のiPhoneアプリを多言語対応してみました。
iPhoneというかObjective-Cに用意されている機構を使えば、割と簡単に対応出来ます。

まずは、サンプルのxibファイルです。

ラベル2個と、ボタン1個というシンプルな画面です。


 次に、Localizeファイルの用意します。
今回は例として、英語と日本語に対応してみます。
適当にLangというフォルダを作って、その下に、en.lprojとja.lprojというフォルダを作ります。この言語フォルダは、ISO_639で定義された2文字か3文字のコードです。他の言語に対応する場合は、このコードに対応したディレクトリを追加すれば大丈夫です。なお、xcodeのグループで作ろうとした場合、実ディレクトリが作れません。最初にFinderでディレクトリだけ作ることをお薦めします。


 ディレクトリを作ったら、Resourcesの下にLocalizable.stringsというファイルを作ります。新規ファイルの作成のMac OS X→Resource→Strings Fileで作れます。注意点は、先ほど作ったディレクトリを指定することです。(直下とかに作ると、二つ目の言語の時に名前が被って作れません)


 二つの言語を追加すると、次のようになります。
Localizable.stringsの下に二つの言語が出てきます。何か良い感じです。


Localizable.stringsの中身は、次のようになります。
English

/* 
   Localizable.strings
   LocalizeSample
 */
"label1"="label1";
"label2"="label2";
"button"="button";

日本語

/* 
   Localizable.strings
   LocalizeSample
 */
"label1"="ラベル1";
"label2"="ラベル2";
"button"="ボタン";

 書式は、"ラベル名"="表示させる内容";となります。
最後のコロンを忘れると、次のようなエラーが出るのでご注意を。プロパティファイルなので、XCodeは指摘してくれません。

Command /Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin/Contents/Resources/copystrings failed with exit code 1


最後にコードの方で、上記のラベルを呼び出せば完了です。

	label1.text = NSLocalizedString(@"label1", @"");
	label2.text = NSLocalizedString(@"label2", @"");
	button.titleLabel.text = NSLocalizedString(@"button", @"");

引数の一つ目がラベル名です。二つ目はコメントなので指定しなくても大丈夫です。
ラベルが見つからなかったら、ラベル名が代入されます。


ちなみにこう言う書き方も出来ます。

	label1.text = [[NSBundle mainBundle] localizedStringForKey:@"label1" value:@"label1" table:nil];

localizedStringForKeyでラベルを探してきて、無かったらvalueの値をセットします。記述量が多いので、基本的には最初の書式で充分じゃないかと思います。


 実行すると次のようになります。
尚iOSシュミレータ上で言語の切替をするのは、シミュレータ上から設定ボタンで変更します。
少し変な感じです。


 また、言語別にアプリの表記名等を代える場合は、InfoPlist.stringsで可能です。

/*
 ja.lproj/InfoPlist.strings
 */
CFBundleDisplayName = "日本語アプリ";


 多言語対応した感想ですが、日本語しか対応しない場合も基本的にはこの作り方で作っておいた方が良いのではないかなと思います。1画面しか無い場合は恩恵は少ないですが、複数画面あるような場合は、表記名の一元管理に威力を発揮します。もちろん多言語対応する場合も簡単になります。是非これは覚えておくべき手法かなと思います。是非お試しあれ!!


参考:
livedoor Techブログ : iPhoneアプリを多言語対応にする

iPhone,iPad開発電子ブック、Appleが無料で公開

 Apple、6冊の開発者向け書籍をiBookstoreで提供開始で知りましたが、iOS Developer Centerで公開されている資料が、無料でiBookStoreに公開されました。


 リンク元によると6冊公開のようですが、日本ではiOS Human user interface Guidelineを除いた5冊のようです。apple developer publicationsで検索するとまとめて出てくるので、全部落としたい時に便利ですよ。


 実は初めてiBookを使ったのですが、ちょっと動作が重いですね。こういう技術系の資料であれば、PDFのままでCroudReaderでさくさく使う読む方が向いていると思います。PDFは、iOS Reference Libraryに一杯あります。主要なドキュメントについては、日本語化もされていますよ。

iPadの神アプリの作者が書いたiPad本 "iPad 電子書籍アプリ開発ガイドブック"

CloudReaderの中島聡さんが、共著で「iPad電子書籍アプリ開発ガイドブック」という本を出していました。紹介エントリーを読むと、次のようにありました。これは期待と、会社帰りに買ってきました。

編集担当の方から、「これから電子書籍アプリを作ろうという人向けにノウハウなどを公開して欲しい」とのリクエストに基づき、CloudReadersの開発経緯とアーキテクチャを解説してみた。


  iPhone/iPadアプリを作ったことがある人は解ると思いますが、CloudReaderをはじめ中島さんの作るアプリの完成度の高さはまさに神の領域です。画像ファイルのロード一つ見ても、切り替えや拡大縮小のあのスムーズさはどう実現しているのだろうと色々考えていました。例え扱うファイルが巨大であろうが、サクサクです。


 そんなCloudReaderの秘密が垣間見れるのが、この本です。中島さん担当部分は最初の20ページ程だけなのが残念ですが、それでも発見することは沢山ありました。一番意外だったのは、Interface Builderを最大限に使い、かつUIKitのデフォルトのクラスを活用していることです。私は、UIKitをあまり使わずにもっとレイヤの低いクラスでガリガリ実装していると思っていました。ところが、UIImageとかで普通に拡大縮小等をしているそうです。理由としては、次の通りらしいです。

高速なGPUを持つiPhoneやiPadにおいては、できるだけハードウェアにアニメーションを任せることが高速化の秘訣だ。そのためには、viewクラスのdrawRect:でちまちまと一枚ずつアニメーションさせるよりは、UIViewのアニメーション機能を最大限に活用した方が、レスポンスもよいし、消費電力も少なくて済む。

 まさに目からウロコですね。今まで自前でチマチマと実装した方が最適化出来てスムーズな処理が出来ると考えていました。でも、それ以前に何が処理するのかという観点がバッサリ抜けていることに気が付きました。この一節だけでも、この本の価値がありますね。
 あとはちゃんとMVCモデル作れとか、基本の部分を改めて指摘されて、確かにその通りだと思いました。Objective-Cの多くのお手本は、ViewとControllerだけの実装が多く、何となくModelを意識することなく作っていました。やっぱり基本に戻ってMVCを意識しながら作っていこうと改めて思いました。


 他の著者の部分はまだ読んでいませんが、中島さんの部分だけでも満足です。本当を言うともっとソースを公開してもらって、工夫した点の解説して貰えば有り難いですが、まぁそこまで求めるのは厚かましすぎるでしょう。考え方のヒントを得られるだけでも、充分ありがたい一冊です。


関連:
新・iPhone/iPadアプリを作るならば、これを読め!!


iPad電子書籍アプリ開発ガイドブック
中島聡 まえだひさこ 新井英資 向井領治 大原ケイ クレイグ・モッド
インプレスジャパン
売り上げランキング: 180

新・iPhone/iPadアプリを作るならば、これを読め!!

 以前、「iPhoneアプリを作るならば、これを読め!!」というエントリーを書きましたが、iPadが出たり色々な本が出たりと状況が変わったので、現状のお薦め本を再度書いてみます。


 初めてiPhone/iPadアプリを作る人という観点で書くと、まず「iPhoneプログラミングUIKit詳解リファレンス」がお薦めです。何故かというと、題名の通りUIKitの使い方に特化しているのです。iPhoneを作ろうとした人には解ると思いますが、最初はとにかくUIKitの使い方が全く解らないのです。ObjectiveCが解らないとかそれ以前の問題なんです。そんな時にはこの本がお薦めです。サンプルコードも多く写真も多いので、初心者に取っ付き易いです。さらに作り方がInterface Builderに依らずコードベースの作り方を紹介している所です。Interface Builderの是非については人によると思いますが、動きの基本が解っていない時からInterface Builderを使っていると、最後までiPhoneの描画の仕組みとか解らないという部分もあると思います。ですので、私としては最初はInterface Builderに依らない作り方を覚えるのが良いと思います。


 次に買うと良いのが、「iPhone SDK アプリケーション開発ガイド」。一通りiPhone/iPadの画面が作れるようになったら、色々な機能を実装したくなります。その時にどんなAPIを使ったらよいのか、リファレンス的に使えます。


 最後に読みたいのが、「詳解 Objective-C 2.0
」です。上記2冊を参考に何とか作りあげても、メモリーリークで泣くことになると思います。というのもObjectiveCのメモリ管理は少し特殊な所があって、ハッキリいってどのタイミングで開放されるのか最初はさっぱり解らないと思います。単純に使い終わったらリリースすれば良いやと思って、かたっぱしからリリースしたらアプリが途中で落ちたりとか。その辺りのオブジェクトの開放の仕組みとかは、iPhone本には殆ど書かれていません。というところで、やはり言語本も必要になります。


 上記三冊があれば、一通り開発出来るようになると思います。


iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 1276
おすすめ度の平均: 5.0
5 アグレッシブでなおかつ真摯な本だと思います
4 長く使える一冊
5 机の上に備えておきたい良書の一冊です
5 幅広い内容


iPhone SDK アプリケーション開発ガイド
Jonathan Zdziarski
オライリージャパン
売り上げランキング: 6122
おすすめ度の平均: 4.0
5 網羅的で、概念を俯瞰的に解説。
5 まずは自分で動くアプリを作った方にお勧めします
4 サンプルコードに間違いが多い
2 中上級者向け
5 iPhone 関連で一番の良書

詳解 Objective-C 2.0
詳解 Objective-C 2.0
posted with amazlet at 10.08.23
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 2233
おすすめ度の平均: 4.0
2 説明が下手だと思う。
5 iPhoneアプリ開発で初めてObjective-C触る人に勧めたい
4 常に手元にあるべき本
5 参考書としておすすめ
1 とにかく分かりにくい。

iPad用タッチペンの作り方。或は、自作スタイラスペン その2 悪戦苦闘編

 前回から少し間が空きましたが、iPad用の自作タッチペンの作り方です。前回の実験で、割り箸やDSのタッチペンにアルミホイルを巻いて先に誘電スポンジを付ければiPhone/iPadに字を書けることが解りました。


 しかし、ビジネスシーンで割り箸にアルミホイルを使うのもどうかなと思いますので、もう少し見栄えの良いものが欲しくなります。そこで、今度はペン先ではなく軸にこだわって作成しました。資材の調達先は、無駄に何でも揃うみんなの東急ハンズです。目指すは導電性のある金属製パイプです。探してみると、真鍮、アルミ、銅、ステンレスと色々あります。また中が空洞のものから、埋まっているもの。円形、角形とこれでもかと色々な種類があります。買いに来た私が言うのも何ですが、こんなモノ誰が買うのだと思う品揃えです。
 まず素材選びですが、導電性という観点では真鍮に比べアルミや銅の方が高いです。真鍮の質感は捨てがたいですが却下しました。またステンレスは、導電性が低いのと硬すぎる(加工し辛い)ので却下しました。残るはアルミか銅なのですが、銅の方が2倍くらい高かったので、アルミにしました。アルミパイプは、中が空洞で直径8mmと5mmで長さがそれぞれ30cmのものです。値段は220円と180円だったかと思います。(値段はうろ覚えです)あわせて、ちゃんとペンの形をしたのも試したかったので、三菱鉛筆ユニホルダーを買いました。これは画材コーナーで売っています。また、念のために細い銅線を買っています。これは導電スポンジを縛る為です。


 とりあえずこの三点で作ったのが試作3号です。

割り箸+アルミホイルに比べると、格段にマシになりました。
上から、スタイラス1号、2号、3号です。


 下記心地の方ですが、アルミ8mm芯の方は申し分ないです。普通に字を書くスピードで書いても、特に問題なく認識されます。それに対して5mm芯の方は、相当ゆっくり書かないと認識されません。色々ペン先を変えて試したのですが、結論的には芯の太さというよりペン先の太さが問題のようです。ペン先が細すぎるとiPhone/iPadの方で認識されません。また、三菱鉛筆ユニフォルダの方ですが、何気に苦労しました。字が書きやすいようになるべくペン先を細くしてみたのですが、5mm芯の場合と同様に認識されないという状態でした。写真のようにペン先の設置面積を大きくすると、スムーズに書けるようになります。というところで、今のところの結論ではある程度のペン先の太さが必要になります。書きやすいんですけど、細かい字が書けないんですよね。まぁ実用上、それなりに納得出来るレベルには達しました。

ちなみに字が汚いのはスタイラスペンの為でなく、元々私の字が汚いからです。


 ちなみに実験してて思ったのですが、iPadのタッチペンの方式である投影型静電容量方式にはテスターのような物が最適なんではないでしょうか?今手元にないですけど、今度試してみたいと思います。


関連:
iPad用タッチペンの作り方。或は、自作スタイラスペン


2mm芯ホルダーMH-500 HB
2mm芯ホルダーMH-500 HB
posted with amazlet at 10.07.19
三菱鉛筆
売り上げランキング: 49122
SANWA SUPPLY TK-P2 導電スポンジ
サンワサプライ
売り上げランキング: 2581
おすすめ度の平均: 5.0
5 DOS/Vユーザー必須のアイテム
5 良かったです♪


ちなみに買ったら、こんな感じです。

サンワサプライ タッチペン PDA-PEN17
サンワサプライ
売り上げランキング: 4385
おすすめ度の平均: 2.0
1 まるでゴミのようだ!
3 先を湿らせて見て
2 AQUOSケータイ
1 使えませんでした。残念
4 使用を始めてそろそろ一か月。

iPad用タッチペンの作り方。或は、自作スタイラスペンの作り方

マルス テクニコ 芯ホルダー 780 C


 以前、「アップルストアにタッチペンが売っていない理由」に書いた通りiPad,iPhone用の公式のタッチペンは売っていません。しかし、欲しいものは欲しいのです。サードパーティからiPadでも使えるタッチペンは幾つか出ていますが、どれも評判はよくありません。ペンの種類としては2種類あって、一つはペン先がゴムのもの。もう一つはスポンジのもの。ゴムのモノはボタンを押すのには良いけど、字を書くのには向いていないようです。これに対してスポンジのものは、そこそこの書き心地のようです。しかし、耐久性に難があるようです。
 そもそもiPadで指で字を書ける仕組みは、画面上の電界を伝導性の物体である指を通して電気を通っているからです。この特性が解っていれば、自作でタッチペンが作れます。まず必要になるのが、導電性のスポンジ。300〜500円で売っているのですが、送料が高いのがたまに傷です。秋葉原か日本橋に近い人は、そこで買えば良いでしょう。もしくは、マザーボードなどの基盤についていくるスポンジも、まさにそれでしょう。(もう10年くらいPCの自作はしていないので、何とも言えないですが。。。)
 スポンジを手に入れたら、適当な大きさに切って棒の先につけて下さい。割り箸とか、DSのタッチペンとか。きっと何も書けないはずです。というのは、スポンジが導電性でも、その先の物体が導電性ではないので電気が伝わっていかないからです。そこで登場するのが、アルミホイル。割り箸やDSのタッチペンに巻いて先にスポンジをつけると、あら不思議。字が書けるようになります。もちろんアルミホイルの部分を握る必要がありますが。
 色々試していて気がついたのですが、スポンジ部分は大き過ぎても駄目。小さ過ぎても駄目です。どうもiPad側の検知の仕組みが、ある程度の設置面積を必要としているようです。試しに爪楊枝、DSタッチペン、割り箸で試してみたのですが、爪楊枝は検知されませんでした。最低限、DSタッチペンや割り箸くらいの面積が必要なようです。
 ちなみに身の回りにあって、iPadに字を書けるモノとして意外なものが一つあります。それは、電池。単三か単四の電池のプラス面を画面にあてて下さい。きっと字が書けるはずです。実用性はゼロですが、iPadの原理を垣間見えるような気がします。
 どういったものが使えるか解ったので、軸の部分をもう少し工夫してみようとおもいます。乞うご期待。


試作品:


参考:
Life is beautiful: iPad用スタイラスを自作する方法
TKYSSTD: iPhone(iPod touch)でスタイラス 1


続き書きました。
iPad用タッチペンの作り方。或は、自作スタイラスペン その2 悪戦苦闘編


2014/1/1追記
 最近では、ペン先が1.9mmと細いタイプのスタイラスペンが発売されています。このレベルまで行くと、普通のペンと同じですね。


エンジニア ICフォーム ZC-02
エンジニア
売り上げランキング: 25


プリンストンテクノロジー iPad/iPhone/iPod touch専用タッチペン(ブラック) PIP-TP2B
プリンストンテクノロジー (2010-07-01)
売り上げランキング: 87

Interface Builderを使わずにiPhone,iPadアプリを作る方法

 iPhone,iPadの画面開発ツールにInterface Builder(IB)があります。Apple謹製ということで使い勝手がよくのですが、ソース中にブラックボックスが入ることが嫌がる人、開発でGUIベースのツールを使いたくない人とInterface Builderを使わずに開発したい人は沢山いると思います。でも始めはどうすれば良いのか結構悩みます。決まりきった手順を覚えておけば簡単ですので、まとめておきます。ちなみにこの辺りのことは、iPhoneプログラミングUIKit詳解リファレンスに非常に丁寧に説明されています。


1.プロジェクトの作成
 何でも良いです。今回はiPad向けのViewBaseプロジェクトでNoMoreIBという名前のプロジェクトを作成しました。


2.MainWindow.xibの削除
 選択して削除するだけです。


3.info.plistの編集
 info.plist(NoMoreIB-info.plist)を開いて、Main nib file base nameを削除します。
 選択の上でDeleteキーを押せば、奇麗さっぱり消してくれます。
 


4.main.mの編集
 info.plistのMain nib file base nameを消したことにより、メインウィンドウを自分で指定する必要があります。そこでmain.mで自分で指定する必要があります。UIApplicationMainの第4引数に起点となるクラスを指定すれば良いです。今回の場合だとNoMoreIBAppDelegateです。

元ソース

    int retVal = UIApplicationMain(argc, argv, nil, nil);

修正後のソース

    int retVal = UIApplicationMain(argc, argv, nil, @"NoMoreIBAppDelegate");


5.NoMoreIBAppDelegate.mの編集
ここまでの用意が出来たら、起動クラスであるNoMoreIBAppDelegateを編集すれば表示できるようになります。ポイントは、最初の二行。Windowを自分で作成の部分です。後は、色々なサンプルにある通りに作れば大丈夫です。

#import "NoMoreIBAppDelegate.h"
#import "NoMoreIBViewController.h"

@implementation NoMoreIBAppDelegate

@synthesize window;
@synthesize viewController;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    
	// Windowを自分で作成
	CGRect frameForWindow = [[UIScreen mainScreen] bounds];
	window = [[UIWindow alloc] initWithFrame:frameForWindow];
	
	//以下、適当にラベルを作って表示します
	CGRect rect = [window frame];
	UILabel* label = [[UILabel alloc] initWithFrame:rect];
	label.text = @"Hello, World";
	[window addSubview:label];
	[label release];
	// Override point for customization after app launch    
	//[window addSubview:viewController.view];
	[window makeKeyAndVisible];

	return YES;
}


- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}


@end


6.ヘッダーの編集
 直接的には関係ないようですが、ヘッダー中のIBOutletという記述も消しておく方がベターのようです。アプリケーションの挙動は変わらないのですが、これはInterface Builderに関係しているとの印です。

修正前

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet NoMoreIBViewController *viewController;

修正後

@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) NoMoreIBViewController *viewController;


7.アプリの起動
 おめでとうございます。


 ちなみにiPhoneプログラミングUIKit詳解リファレンスですが、非常に解り易いのです。これからiPhone,iPadの開発を始めるという方には、お勧めの1冊です。


iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 1617
おすすめ度の平均: 4.5
4 長く使える一冊
5 机の上に備えておきたい良書の一冊です
5 幅広い内容