2008年7月1日火曜日

Creating an iPhone Applicationその5

Creating an iPhone Application
http://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.action

まだまた、"Creating an iPhone Application"のメモが続きます(苦笑)
他のメモと同様に翻訳じゃないのでたくさん抜けていますし、たくさん間違っているハズですが、原文を読むときの参考にはなると思います。

■ Taking Your Applications Further
この項目が最後で、これ以降にも項目はありますが文字がわずかに小さく小項目になっています。見た目が命のAppleにしては珍しく分かりにくいレイアウトです(笑)

デバイスの向きに合わせてViewを変えるなどのiPhone独自の機能に関しての解説です。ハードウェアの利用方法をiPhoneの既存アプリケーションに合わせて統一感を持たせるようにAppleは求めているようです。

>Tracking Orientation and Motion Using the Accelerometers
加速度検出器の話しですが、XYZのどれがどの方向に割り当てられているか注意が必要です。加速度検出は重力検出として利用することで装置が縦向きか横向きかなどを検出できます。

装置の向きが変わるとシステムがアプリケーションに知らせますので、向きに合わせてViewを縦向きや横向きなどに変更できます。UIViewControllerクラスが向きの変化に合わせて、インタフェースを回転させたり、Viewの位置を自動修正するなどの機能を提供します。

加速度検出器の生データを見るときはUIKitのUIAccelerometerオブジェクトを使用します。UIAccelerometerは指定したタイミングでデータを得ることができます。また、前後に振っているなどの動きや向きを知ることもできます。

詳細は"iPhone OS Programming Guide"の"Accessing Accelerometer Events"の項目を見ろと書かれています。

>Accessing the User's Contacts
ユーザのアドレス帳を利用できます。Phone、Mail、SMS(Short Message Service)Textなどと同じ容易にこのサービスを利用できます。

iPhone OSはアドレス帳に直接、あるいは間接的にフィルタをかけるなどの方法でアクセスできます。連絡データを取り出したり生成したりするシステム インタフェースが提供されています。このインタフェースを利用することにより、システムと似た感触をもったアプリケーションを開発できます。

詳細は"Address Book Framework Reference"と"Address Book UI Framework Reference"を見ろと書いています。

>Getting the User's Current Location
iPhone OSが走っている装置はユーザの動きに合わせます。ユーザの現在位置に合わせた情報を元に、インターネットでどこでも仕事ができます。Core Locationフレームワークにより、現在位置に近くの喫茶店のリストを提供することができます。

Core Locationフレームワークは携帯電話のアンテナやWi-Fiホットスポット(もちろんGPSも)の信号をモニタして三角測量しています。アプリケションからこのフレームワークを利用することで、現在位置を知ったり、位置が変わったことを知ることができます。

詳細は"iPhone OS Programming Guide"の"Getting the User's Current Location"の項目を見ろと書かれています。

>Playing Audio and Video
iPhone OSはCore AudioとOpenALフレームワークを通してオーディオを利用できます。さらにMedia Playerフレームワークを使用してビデオ再生もできます。
Core Audioでは再生、録音、音声処理、ストリーム オーディオ再生のインタフェースを提供します。簡単な音声エフェクトや複数音声再生、合成、音場再生処理、バイブレーションに利用できるそうです。

Media Playerフレームワークはビデオをフルスクリーン(だけ)で再生します。さまざまなフォーマットのビデオ再生ができると書いています。再生コントロールの表示や再生アスペクト比なども設定できるそうで、ゲームに使えるとしています。この文章ではゲームで利用できるという内容が多いですね。

例によって、詳細は"iPhone OS Programming Guide"の"Audio and Video Technologies"を見ろと書いています。

> Taking Pictures with the Built-in Camera
CameraアプリケションはUIKitフレームワークのUIImagePickerControllerクラスを経由してiPhoneで写真を撮影して、他の写真と共にライブラリに追加できるとしていますが、動画のことが書かれていません。Pickerインタフェースを表示して、Pickerコントローラがユーザとのやり取りを処理して、イメージを返します。

詳細は"iPhone OS Programming Guide"の"Taking Pictures with the Camera"と"Picking a Photo from the Photo Library"の項目を見ろと書いています。

ようやく、一ページを読み終えました(笑)

Creating an iPhone Applicationその4

Creating an iPhone Application
http://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.action

"Creating an iPhone Applicationその3"のメモの続きです。1ページを読むのに長々と続いていますが、他のメモと同様に翻訳じゃないのでたくさん抜けている点も、たくさん間違っている点も、原文を読むときの参考にはなると思う点も同じです。

■ Animating the Button's Movement
まずはアニメーションによる情報提供の重要性を説いています。素早い理解を得る言う意味でアニメーションのインタフェースを捉えると、iPhoneは今までのPDAやPCとは一線を画していると言えそうです。最初にMacintoshを見たときの驚きに近いものを感じるのはこの点かもしれません。ここでは例として画面の切り替えアニメーションが上下左右のどちらに行くかで、情報の詳しさを表していると解説しています。

UIKitにはアニメーションが組込済みなので、アプリケーションMoveMeではWelcomeボタンのアニメーションに利用でき、基本的な動作は以下の通り、

1.アニメーション関連ViewのbeginAnimations:context:メソッドを呼び出し
2.アニメーションのプロパティ設定
3.アニメーションを開始するViewのcommitAnimationsメソッドを呼び出し

Listing 8はWelcomeボタンが最初にタッチされたときの動きをするために使用されたコードです。アニメーションの時間設定を大きさの設定をしています。アニメーションが終了するとアニメーションdelegateのgrowAnimationDidStop:finished:context:メソッドがボタンを少し小さくして、プラカードを指の位置に移動させます。

詳細は"iPhone OS Programming Guide"の"Applying Core Animation Effects"の項目を見ろと書かれています。

■ Finishing the Application
ここはInfo.plistの話しです。Info.plistはKEXTなどでも悩ましい存在です(苦笑)

Listing 9がアプリケーションMoveMeのInfo.plistですが、ベータ8のSDKでは表形式で表示されています。この表形式は新しいProperty List Editorと同じです。XMLに特化したテキストエディタであった旧版と比べて、Xcodeのビルド設定に近い感じになっています。Info.plistには実行ファイルの名前、アイコンのファイル名前、システムがアプリケーションを識別するための名前などが入りますが、iPhone独自のものとしてステータスバー表示の有無を決めるUIStatusBarHiddenキーがあります。プログラム内からもこの設定はできるそうですが、アプリケーションがらうんちした後で消えるので奇妙な感じになると書いています。

詳細は"iPhone OS Programming Guide"の"The Information Property List"の項目を見ろと書いています。

・・・と、ここまで基本だそうで、これ以降の項目ではiPhoneらしい機能を紹介するそうです。

2008年6月28日土曜日

iPhone SDK β8

iPhone SDKのサイトを見るとβ8が上がっていました。今試しているAppleのサンプルコードとどの程度互換性があるか気になります。アンインストールの方法は書いてはいるものの、面倒なことに替わりありません(笑)

readmeによると、このベータ8はiPhone 2.0の最終版と互換性があり、App Storeに登録するiPhone OSアプリケーションに使うように書いています。登録するためにはiPhone Developer Programの会員になるように、とも書いています。あとは、例によってインストールとアンインストールの注意書きです。

Creating an iPhone Applicationその3

Creating an iPhone Application
http://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.action

"Creating an iPhone Applicationその2"のメモの続きです。他のメモと同様に翻訳じゃないのでたくさん抜けていますし、たくさん間違っているハズですが、原文を読むときの参考にはなると思います。

■ Drawing the Welcome Button
UIKitが提供している標準的なViewは単純な内容であれば変更なしに表示できて、イメージならUIImageView、文字列ならUILabelが使えます。アプリケーションMoveMeだと、UIViewオブジェクトのbackgroundColorプロパティで背景色を初期化メソッドで描画しています。backgroundColorプロパティはInterface BuilderでnibファイルMoveMeView.xib内のMoveMeViewを作るときにInspectorウィンドウのAttributeタブで設定しています。複雑な背景が必要なときにはUIKitの棒が機能か、QuartzやOpenGL ESを利用できます。

アプリケーションMoveMeのPlacardViewクラスはWelcomeボタンの描画とスクリーン上の位置管理をします。PlacardViewクラスはすべてのプロセスを紹介するために、あえて前述のUIImageViewやUILabelを使わずに描画しています。描画はPlacardView.mファイル内のdrawRect:メソッドで行われています。

drawRect:メソッドが呼び出された時点で、描画のための環境は利用可能になっていますので、必要な描画命令を発効するだけです。PlacardViewクラスの描画内容はPlacard.pngで描かれたバックグランドとテキストで、テキストは逐次変更することが出来ます・・・とここでPlacard.pngの描画が気になって調べてみると、PlacardView.mファイル内でinitメソッドでPlacard.pngイメージ ファイルを読み込み、placardImageオブジェクトに入れてdrawRect内でdorawATPointメソッドで位置を指定して描画していて、確かに描画の手順が詳しく分かるようになっています・・・解説文に戻ると、処理の手順が示されています。

1.現在のView座標0にボタンの背景イメージを描画しています。この時にViewの大きさはイメージに合うようになっていて、ボタン全体が描画されています。

2.ボタンの中央に来るようにWelcom文字列の位置を計算します。この文字列はさまざまに変わるので、毎回計算しなくてはなりません。

3.描画色を黒に設定します。([[UIColor blackColor] set]のことを言っているのであろうが、この行をコメントアウトしても結果は変わりません。おそらく初期値が黒なのでしょう)

4.文字列をずらせて描画

5.描画色を白に設定します。

4.文字列を描画します。

Listing 4では、placardImageメンバ変数がボタン背景の入ったUIImageオブジェクトを保持し、currentDisplayStringメンバ変数が文字列の入ったNSStringオブジェクトを保持しています。イメージを描画した後で、文字列の位置を計算しtextSizeメンバ変数にいれます。文字列は陰を付けるために黒と白で二回描画されています。描画はNSStringのメソッドで行なわれています。

前述のように複雑な描画をするときにはQuartzかOpenGL ESが利用できますが、QuartzはUIKitと共にベクトル パス、イメージ、PDFなどを描画できます。QuartzとUIKitは同じ描画環境ですので、drawRect:メソッドから呼び出せます。

OpenGL ESは2Dや3Dの描画ができますが、drawRect:メソッドは利用できません。ViewはOpenGL ESの表面描画に利用されます。表面描画に利用するオブジェクトの選択や描画頻度は自由に決められます。

詳細は"iPhone OS Programming Guide"の"Graphics and Drawing"の項目を見ろと書かれています。

■ Handling Touch Events
マルチタッチ インタフェースの処理ですが、とうぜん既存のマウス処理とは異なります。2番目以降の指が触れる度にタッチ イベントが発行されます。また、画面にふれているそれぞれの指が移動しても、指が画面から離れてもタッチ イベントが発行されます。

一本の指で操作後にもう一本の指が追加されることは想定しておらず、この単純化でジェスチャを識別しやすくしています。システムはswipesなどの共通のジェスチャを識別する方法を手今日していますが、独自に複雑なジェスチャ識別をさせることもできます。新しいタッチイベントが生成されたときに、各指がタッチしているか、離れたかなどの情報も提供されます。これにより、新しいタッチイベントが発生する度に、各指の動きを追跡できます。Figure 4に示すようなピンチ クローズやピンチ オープンのジェスチャのイベントが発生すると、Viewがサポートしている拡大縮小としてズームのレベルを変更できます。

システムはUIResponderクラスをインスタンスしたオブジェクトにイベントを配信します。アプリケーションMoveMeでは二つのViewクラスを利用していますが、MoveMeViewクラスがイベントを処理します。このクラスはタップがWelcomeボタンの内側で発生したのか外で発生したのかの識別をUIResponderのメソッドをオーバライドすることで実現しています。

単純にするためにアプリケーションMoveMeでは最初にタッチした指だけを追跡します。UIViewクラスが初期値でマルチタッチ イベントOFFの状態であることを利用しています。マルチタッチ イベントがOFFだと、システムは最初にタッチした指が生成するイベントのみを配信します。マルチタッチのイベントが必要な場合にはUIViewクラスのsetMultipleTouchEnabled:メソッドを利用します。

イベント処理の一貫として、MoveMeViewクラスは以下の手順を踏みます。

1.最初のタッチイベントが届くと、発生した場所を調べます。
 ・ボタン外でのダブルタップ - 文字列の変更
 ・ボタン内でのシングルタップ - ボタンの中央を指の下に移動し、ボタンを拡大してアニメーションを初期化
 ・他のタッチは無視

2.ボタン内をタッチしている指が移動すると、新しい位置にボタンの位置を変更します。

3.ボタン内をタッチしている指が離れるとボタンを中央に戻すアニメーションを始めます。

Listing 5ではMoveMeView.mファイル内のMoveMeView用touchesBegan:withEventメソッドを示しています。touchesBegan:withEventメソッドはUIResponder.hで宣言されています。指が最初にふれるとシステムはこのメソッドを呼び出します。このメソッドはすべてのタッチを取得するので、その中から一つだけを取り出します。UITouchオブジェクトはMoveMeViewオブジェクトとPlacardViewオブジェクトのいずれでタッチイベントが発生したかと、その回数を調べるために使用されます。もし、ボタン外でダブルタッチが発生するとtouchesBegan:withEventメソッドはWelcomeボタンのもじれとを次の文字に入れ替えるためにsetupNextDisplayString:メソッドを呼び出します。また、ボタン内の場合にはボタンを拡大してタッチされた場所を追跡するためにanimateFirstTouchAtPoint:メソッドを呼び出します。他のイベントは無視されます。

Listing 6ではMoveMeViewクラスのtouchesMoved:withEvent:メソッドを示しています。指が触れて移動したときにシステムはこのメソッドを呼び出します。最初に指が触れた場所に関係なくこのメソッドは呼び出されますので、アプリケーションMoveMeではボタン内でイベントが発生しているかを調べ、その場合にはPlacardViewオブジェクトの中心を設定しなおし再描画しています。

Listing 7 ではtouchesEnded:withEvent:メソッドを示しており、指が離れるとシステムはこのメソッドを呼び出します。アプリケーションMoveMeではボタンを画面中央に戻すアニメーションを実行します。

アプリケーションのイベント取扱を簡素化するために、ボタンが元に戻るアニメーション期間中はViewのtouchesEnded:withEvent: メソッドを不可にしています。もし、不可にしないと、各イベント処理メソッドはボタンがアニメーション中であるかと、アニメーションのキャンセルを識別するコードが必要なります・・・などなど説明が書かれています。ボタンが元の位置に戻ると、MoveMeViewクラスのanimationDidStop:finished:メソッドがユーザからの入力を可能にします。

詳細は"iPhone OS Programming Guide"の "Event Handling"の項目を見ろと書いています。

・・・と、このページは意外と長くて、まだまだ続きます(笑)

2008年6月26日木曜日

Creating an iPhone Applicationその2

Creating an iPhone Application
http://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.action

"Creating an iPhone Applicationその1"のメモの続きです。その1と同様に翻訳じゃないのでたくさん抜けていますし、たくさん間違っているハズですが、原文を読むときの参考にはなると思います。

■ Defining the Application Delegate
MoveMeのApplication DelegateクラスはMoveMeAppDelegate.hとMoveMeAppDelegate.mにあります。

Application DelegateオブジェクトはUIApplicationオブジェクトと共にアプリケーションの状態が変化したときに機能します。

 アプリケーションのウィンドウを設定し、ユーザインタフェースを初期化
 アプリケーション内で独自作成したデータ エンジンの初期化
 アプリケーション内のURLを開く
 装置の方向が変化するとそれに応答する
 終了要求の処理

アプリケーションの起動時にDelegateオブジェクトがすることは設定とウィンドウの提供で、詳細は次の項目で説明しています。また、Delegateでは前回終了したときの状態を復帰し、必要なオブジェクトを生成します。アプリケーションが終了する時もDelegateが終了処理を行い、次回の起動時に必要な情報を記録します。詳細はiPhone OS Programming Guideの"Core Application Architecture"を参照してください、と書いているのでここでそれぞれ対応するメソッドが書かれているのでしょう。

■ Creating the Application Window
UIWindowクラスは一つのウィンドウのみを扱い、ユーザインタフェースを変えるときにはViewを変えまるそうで、言い方を変えるとウィンドウはユーザインタフェースを置く場所を提供し、Viewが中身を提供する、という事だそうです。ViewはUIViewクラスのインスタンスでウィンドウの中身を書き、応答します。iPhoneはテーブル、ボタン、テキスト フィールドなどの標準Viewを提供していますが、UIViewをサブクラスすることで独自のユーザインタフェース部品を作成できます。MoveMeではMoveMeViewとPlacardViewの二つを作成しています。一つはアプリケーションのインタフェース、もう一つはユーザへの応答処理です。

起動時にはウィンドウを表示して内容を表示します。ウィンドウはnibファイルのMainWindow.xibから取り出します。アプリケーションがlauchedの状態になり、イベント処理が始まると、UIApplicationオブジェクトはDelegateにapplicationDidFinishLaunching:メッセージを送ります。メッセージはDelegateがウィンドウの内容描画するきっかけとなり、アプリケーションが必要な他の初期化を行います。

MoveMeでは、DelegateのapplicationDidFinishLaunching:メソッドは以下のことを行います。

1.ウィンドウのView内容を管理するView Controllerオブジェクトを生成
2.MoveMeViewクラスのインスタンスでView Controllerを初期化します。MoveMeViewクラスはnibファイルMoveMeView.xibに入っており、背景のViewとしてウィンドウのフレーム全体を埋めます。
3.ウィンドウのSubviewとしてControllerのViewを追加します。
4.ウィンドウを表示します。

Listing 2はMoveMeのapplicationDidFinishLaunching:メソッドで、MoveMeAppDelegate.mで宣言されています。この中ではウィンドウ内の主なViewを生成し、ウィンドウを表示しています。ウィンドウを表示することにより、システムはイベント処理を開始して良いことを知ります。

applicationDidFinishLaunching:メソッドは他のアプリケーションでも利用されるそうです。ここまでソースコードを見ずにメモをとり続けましたが、applicationDidFinishLaunchingが宣言されているUIApplication.hを見ると他にも色々と関数(メソッド)が並んでいます。

MoveMeViewオブジェクトがnibファイルから取り出されると、MoveMeView.m内のinitWithCoder:メソッドが呼ばれるそうです。このinitWithCoderの詳細は"NSCoding Protocol Reference"に書かれているのでしょう。initWithCoderはMoveMeViewクラスを呼び、さらに同じファイル内のsetUpPlacardViewメソッドがPlacardViewクラスを呼び出して、Welcomeボタンを表示する・・・と言うことだそうです。

Listing 3はMoveMeView.m内のsetUpPlacardViewメソッドです。このViewの初期化部分ではMoveMeView.hで宣言されたPlacardViewオブジェクトが生成されます。MoveMeViewクラスはアプリケーション全体の背景を提供するため、PlacardViewオブジェクトをSubviewとして追加します。二つのViewの関連は、アプリケーションの背景上にWelcomeボタンを表示することと、ボタンに対するイベント処理をMoveMeViewにさせることです。このplacardViewが良くわからなくて、その宣言に@implementation MovideMeViewの直下で@synthesizeというのが使われています。WindowとViewの詳細は"iPhone OS Programming Guide"の"Windows and Views"の項目を見ろと書かれています。

2008年6月25日水曜日

Creating an iPhone Applicationその1

Creating an iPhone Application
http://developer.apple.com/iphone/gettingstarted/docs/creatingiphoneapps.action

上記資料のメモです。翻訳じゃないのでたくさん抜けています。

この資料はサンプルコード"MoveMe"を元に基本的なiPhoneのプログラミングを解説しています。面白いことにiPhone Dev Centerのトップにはこのサンプルコードへのアンカーがありません。試した限りではSDK beta 7で修正なしでコンパイルし実行できました(笑)ただ、ReadMe.txtをみるとバージョンアップを重ねていて、私が試したのは2008/06/02付けのバージョン2.5です。

このサンプルでは以下のiPhoneとして典型的な処理を含んでいるそうです。

アプリケーション初期化
ウィンドウ表示
内容描画
タッチ イベント処理
アニメーション実行

Figure 1が実行結果で"Welcome"ボタンを押すとボタンのサイズが大きくなり、押したまま指を動かすとボタンが指の動きについて来るというものです。また、ボタン以外の場所をダブルタップすると"Welcome"が日本語も含む各国の言葉に変わります。

Figure 1
http://devimages.apple.com/iphone/gettingstarted/docs/images/MoveMe.jpg

ここで、予め読んでいた方がよい資料を三つ上げています。

以下の三つの項目はXcodeを知らない人向けです。
 ■ Examining the MoveMe Sample Project
 ■ Building the MoveMe Application
 ■ A Word About Memory Management
なお、私が試した環境ではActive SDKメニューは表示されておらず、ツールバーのカスタマイズの中に入ったままでした。ただ、ボタンが並びすぎるのは好みではないので、メニューで確認しました。

メモリに制限のある環境での開発経験がない人は、メモリ管理の後半部分は目を通した方がよいかもしれません。

■ Initializing the MoveMe Application
この部分はMac OS Xと関数名などが多少異なっているが基本的に同じです。

iPhoneのヘルプファイル

以下のサイトはiPhoneのヘルプファイルですが、iPhoneにあわせたHTMLのサンプルとして便利そうです。

iPhone User Guide
http://help.apple.com/iphone/guide/

ソースコードを見ると、index.cssにDashcodeを使って書いたとあります。Dashcodeをちらりと見ただけで試していませんが、iPhone用のHTML作成ツールとして勉強する価値がありそうです。

Open Source

Appleが主催するdarwin-devのMailing listにAppleのDarwin TeamのWilliam SiegristがDeveloper Tools 3.1.3とiPhone OS 3.0関連のソース一部を公開したと投稿していました。 Developer To...