japan.internet.com
デベロッパー2010年6月29日 10:00

iPad のプログラミング:iPhone アプリの移植、パート I

この記事のURLhttp://japan.internet.com/developer/20100629/26.html
著者:Wei-Meng Lee
海外internet.com発の記事
Apple が iPad を発売し、iPhone 3.2 SDK の NDA を解禁したことを受け、開発者は iPad アプリケーションの開発に着手できるようになった。多くの開発者にとって、iPad アプリケーションを開発するということは、自社の既存アプリケーションを iPad プラットフォームに移植することを意味する。iPad でも iPhone OS が動作しているが、開発者がアプリケーションをこの新デバイスに移植する際に注意しなければならない微妙な違いがある。本稿では、既存の iPhone アプリを iPad に移植するためのさまざまな手法を考察する。

手法1:iPhone と iPad の両プラットフォームをサポート

iPad は、iPhone や iPod touch が搭載するものと同じ画面サイズ(320 x 480 ピクセル)を使って最初から既存の iPhone アプリを実行することができる。アプリケーションは画面の一部だけを使うことになる。しかし、このモードで動作するアプリケーションは、iPad が搭載するはるかに大きい画面を十分に活かせない。これが大きさではるかに上回る iPad の画面に開発者がアプリケーション UI を移植するまでの時間稼ぎに Apple が採用した暫定的な解決策であることは明らかだ。

iPhone アプリケーションが確実に iPad アプリケーション(つまりフルスクリーン対応)でも動作できるようにするには、Xcode アプリケーションで同デバイスのターゲット設定を修正するのが最も簡単な方法だ。以下にその手順を示す。

Xcode を使い、新しい View ベースの Application (iPhone)プロジェクトを作成する(図1参照)。


図1 iPhone 向けに View ベースのアプリケーションを作成する。

このプロジェクトに「MyiPhoneApp」という名前を付け、「MyiPhoneAppViewController.xib」ファイルをダブルクリックして Interface Builder で編集する。「View」ウィンドウに以下のビュウを入力する(図2参照)。

* Label
* TextField
* Button



図2 「View」ウィンドウにビュウを入れる。

Xcode に戻り、「Command-R」を押して iPhone Simulator 上でアプリケーションをテストする。図3のような画面になるはずだ。


図3 iPhone Simulator でアプリケーションを実行する。

Xcode でシミュレータを「Simulator - 3.2 | Debug」に変更し、「Command-R」をもう一度押す。今回はアプリケーションが iPad Simulator 内で iPhone アプリケーションとして動作する(図4参照)。これが iPad で動作する iPhone アプリケーションのデフォルトの動作となる。


図4 iPad Simulator でアプリケーションを実行する。

次は、Xcode で「Targets」項目を開き、「MyiPhoneApp」項目を選択する。「Info (i) 」ボタン(ツールバーの一番上)をクリックしてその Info ページ(図5参照)を表示する。「Build」タブをクリックして、リストを下にスクロールする。「Deployment」セクションで、「Targeted Device Family」設定から「iPhone/iPad」を選択する。


図5 プロジェクトの「Targeted Device Family」設定を「iPhone/iPad」に変更する。

「Command-R」を押してシミュレータ上でもう一度アプリケーションをテストする。今度はアプリケーションが iPad ネイティブで動作する(図6参照)。


図6 iPad アプリケーションとしてアプリケーションを実行する。

アプリケーションの UI が iPhone のそれと全く同じであることに注目する。アプリケーションが iPad 上で動作しているときは、自己責任で UI を再利用する。iPad 上で動作していることがアプリケーションによって検知されたらビュウをプログラムで再調整する必要がある。

プログラムによるプラットフォームの検知

デバイスに応じて UI を再利用する場合は、アプリケーションが iPhone/iPod touch と iPad のどちらのモードで動作しているかをプログラムで検知することが重要だ。その方法を以下のコードで示す。

「MyiPhoneAppViewController.m」ファイルに以下のコードを書く。

-(void) viewDidLoad {


    #if (__IPHONE_OS_VERSION_MAX_ALLOWED >= 30200)

    NSString *str;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        str = [NSString stringWithString:@"Running as an iPad application"];
    } else {
        str = [NSString stringWithString:
                  @"Running as an iPhone/iPod touch application"];
    }

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Platform"
                                                    message:str
                                                   delegate:nil
                                          cancelButtonTitle:@"OK" 
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];     

    #endif    
    
    [super viewDidLoad];
}
上のコードには、アプリケーションが iPhone OS バージョン3.2以上対応でコンパイルされる場合は、実行中のアプリケーションのタイプをプログラムで検知する一連のコードを含めることを示唆する条件付きコンパイル・ディレクティブが含まれている。

「Command-R」を押して Simulator 上でアプリケーションをテストする。図7のように表示されるメッセージを確認する。


図7 実行時の対応プラットフォームを表示する。

ここで Xcode に戻って「Simulator - 3.1.3 | Debug」項目を選び、「Command-R」をもう一度押すと、iPhone Simulator が表示され、警告は全く表示されない。これは、アプリケーションが iPhone OS 3.1.3をターゲットにしてコンパイルされるようになり、そのためにコンパイラが#if-#endif ブロックでコードを省略するようになったためだ。

次は Xcode に戻り、「Targeted Device Family」設定(前項参照)で「iPhone」を選択し、「Simulator - 3.2 | Debug」項目を選ぶ。「Command-R」を押すと、アプリケーションが iPad Simulator 上で iPhone アプリケーションとして動作するようになる。図8はそれが表示する警告だ。


図8 iPad Simulator 上で iPhone アプリケーションとして実行する。

手法2:ユニバーサルアプリケーションの作成

前の手法は、iPhone と iPad の両方で動作するアプリケーションを1つ作成するための「Targeted Device Family」設定の変更方法を示している。難しいのは、アプリケーションの UI を各プラットフォームに合わせて調整する部分で、アプリケーションが動作しているデバイスをプログラムで検知してから UI のレイアウトをダイナミックに変更する必要がある。

Apple は、iPhone と iPad の両方をターゲットにし、各プラットフォームの UI を示す XIB ファイルを別々に用意する「Universal」アプリケーションの作成を推奨している。以下の手順は、Universal アプリケーションの作成方法を示している。

Xcode を使って View ベースの Application (iPhone)プロジェクトを作成し、これに「Universal」という名前を付ける。「UniversalViewController.xib」ファイルをダブルクリックして Interface Builder でこれを編集する。

「View」ウィンドウに「Label」ビュウを追加して図9のようなラベルを付ける。


図9「View」ウィンドウへの項目追加

「Command-R」を押して iPhone Simulator 上でアプリケーションをテストする。iPhone Simulator 上でアプリケーションが実行される(図10参照)。


図10 iPhone アプリケーションを実行する。

Xcode に戻り、「Targets」項目を開いて「Universal」項目を選択する。「Project’Upgrade Current Target for iPad」を選択する…(図11参照)。


図11 Xcode でプロジェクトを iPad にアップグレードする。

表示されるダイアログボックスで、「One Universal」アプリケーションオプションにチェックを入れ、「OK」をクリックする(図12参照)。


図12 「Universal」アプリケーションオプションの選択

「MainWindow-iPad.xib」という名前の XIB ファイルが入った「Resources-iPad」という名前のフォルダが表示される(図13参照)。


図13 Xcode で作成したリソースをチェックする。

Xcode は MainWindow.xib のコピーを自動的に作成し、これに「MainWindow-iPad」という名前を付ける。デフォルトでは、「MainWindow.xib」も「MainWindow-iPad」もアプリケーションの起動時に自動的に「UniversalViewController.xib」を読み込む。

さらに、Xcode が「Targeted Device Family」設定(Xcode 内のターゲットにある Deployment セクションの下)を「iPhone/iPad」に変更している。

自己責任で iPhone と iPad のユーザーインターフェースごとに別々の XIB ファイル を作成する必要がある。

「Resources」フォルダ内にある「Universal-Info.plist」ファイルをチェックする。そこには「MainWindow-iPad」という値が入った「Main nib file base name (iPad)」という名前のキーがある(図14参照)。


図14 plist ファイルの新しいキー。

iPhone や iPod touch にアプリケーションが読み込まれると、「MainWindow.xib」ファイルも読み込まれる。iPad にアプリケーションが読み込まれると、「MainWindow-iPad.xib」ファイルも読み込まれる。

「Resources-iPad」フォルダを右クリックして「Add’New File」…を選択する(図15参照)。


図15 「Resources-iPad」フォルダに新しいファイルを追加する。

「Cocoa Touch Class」項目を選択してから「UIViewController」サブクラステンプレートを選択する(図16参照)。ユーザーインターフェースオプションで「Targeted for iPad」と「With XIB」いチェックが入っていることを確認する。「Next」をクリックする。


図16 「UIViewController」サブクラステンプレートを選択する。

このクラスに「iPadUniversalViewController.m」という名前を付ける。これで「Resources-iPad」フォルダは図17のようになる。


図17 Xcode によって追加されたファイルをチェックする。

付属のビュウコントローラクラス(「.h」および「.m」ファイル)と一緒に XIB ファイルが見えるはずだ。厳密に言えば、新しいビュウコントローラ・クラスは不要だ。新しい XIB ファイル(iPadUniversalViewController.xib)は既存のビュウコントローラ(UniversalViewController)に結びつけることができ、これは現在 UniverslViewController.xib に結びつけられている。基本的には、2つの XIB ファイルを同じビュウコントローラ・クラスに結びつけることができる。

「iPadUniversalViewController.xib」ファイルをダブルクリックしてこれを Interface Builder で編集する。

「View」ウィンドウに「Label」ビュウを追加し、図18で示されるような文字列を表示するよう設定する。


図18 「View」ウィンドウに項目を追加する。

「MainWindow-iPad.xib」ファイルをダブルクリックして Interface Builder で編集する。

「I Pad Universal View Controller」項目を選択し、その「Identity Inspector」ウィンドウを表示する。その「Class」を「iPadUniversalViewController」にセットする(図19参照)。


図19 iPadUniversalViewController クラスを読み込むよう MainWindow-iPad.xib のコンフィギュレーションを行う。

同じビュウコントローラが選択されたところで、その「Attributes Inspector」ウィンドウを表示し、「NIB Name」属性を「iPadUniversalViewController」にセットする(図20参照)。


図20 ビュウコントローラの NIB 名を変更する。

Xcode で「Simulator - 3.2 | Debug」を選択し、「Command-R」を押してアプリケーションを iPad Simulator 上でテストする。図21のようにアプリケーションが表示される。


図21 iPad Simulator でアプリケーションを実行する。

ここで「Simulator - 3.1.3 | Debug」を選択して「Command-R」を押して iPhone Simulator 上でアプリケーションをテストすると、図22のようにアプリケーションが表示される。


図22 iPhone Simulator でアプリケーションを実行する。

Universal アプリケーションで重要なのは、iPhone 用が1つ、iPad 用が1つと、プラットフォームごとに別々に XIB ファイルを作成する必要があることだ。一度こうしておけば、アプリケーション自身が iPhone 上で動作しているのか、iPad 上で動作しているのかを自動的に検知し、適切な XIB ファイルを読み込む。

このアプローチを採用すると、最終的にはアプリケーションの実行イメージが1つだけになる。

まとめ

本稿では、iPhone と iPad の両方をサポートするよう既存の iPhone アプリケーションを移植する方法を見てきた。複数のプラットフォームをターゲットにしたコードベースを1つだけ取っておけば良いため、一般には Universal アプリケーションのアプローチが推奨されている。
japan.internet.comのウエブサイトの内容は全て、国際法、日本国内法の定める著作権法並びに商標法の規定によって保護されており、その知的財産権、著作権、商標の所有者はインターネットコム株式会社、インターネットコム株式会社の関連会社または第三者にあたる権利者となっています。
本サイトの全てのコンテンツ、テキスト、グラフィック、写真、表、グラフ、音声、動画などに関して、その一部または全部を、japan.internet.comの許諾なしに、変更、複製、再出版、アップロード、掲示、転送、配布、さらには、社内LAN、メーリングリストなどにおいて共有することはできません。
ただし、コンテンツの著作権又は所有権情報を変更あるいは削除せず、利用者自身の個人的かつ非商業的な利用目的に限ってのみ、本サイトのコンテンツをプリント、ダウンロードすることは認められています。

Copyright 2014 internet.com K.K. (Japan) All Rights Reserved.