Qt 5.2から、iOS/Androidネイティブアプリの生成がサポートされました。とりあえずiOSアプリについて試してみたメモ。
開発環境のインストール
Xcode
Xcode 5.1.1および、Xcode Command Line Toolsのインストールが必要です。
アプリを実機にインストールする場合、またApp Storeにリリースするビルドを行なう場合は、Xcodeメニューの[Preferences...]->[Accounts]画面でiOS Developer Programに加入しているアカウントを追加し、証明書とプロビジョニングプロファイルをダウンロードしておく必要があります。
Qt
今回はQt 5.3.1で確認しました。Download Qtからオンラインインストーラでインストールできます。
インストールパスは
/Applications/Qt/
としました。
ビルドに使用するqmake
などのコマンドが、Mac OS Xネイティブアプリ向けの
/Applications/Qt/5.3/clang_64/bin
のほか、
/Applications/Qt/5.3/android_armv7/bin
/Applications/Qt/5.3/ios/bin
にもインストールされます。
Qtプロジェクトの作成
QtのIDEであるQt Creator.app
を起動して"新しいプロジェクト"をクリック、テンプレートを選択します。
このとき「サポートされるプラットフォーム」が表示されますが、今のところ全てのテンプレートでiOSもサポートされているようです。
テンプレートを選択したら、プロジェクトの格納パスを決定します。
続いてキットを選択します。ここでiphoneos
(実機用)とiphonesimulator
(シミュレータ用)を選択します。
そのほか、テンプレートに応じた設定などを確認すると、Qtプロジェクトが作られます。
Qtプロジェクトのビルド(IDE)
そのままQt Creatorでアプリのビルドを実行してみます。 まず、メニューの[ビルド]->[ビルド/実行キットセレクタを開く…]を選択して下記ウィンドウを出し、キット=iphonesimulator、ビルド=デバッグを選択します。
続いてメニューの[ビルド]->[実行]でビルド、iOSシミュレータへのデプロイ、アプリ起動まで実行されます(iOSシミュレータのバージョン、解像度は指定できないようです)。
また同様に、実行キットセレクタでキット=iphoneosを選択すると、USB接続している実機でアプリ起動まで実行されます。
Qtプロジェクトのビルド(コマンドライン)
IDEでなく、コマンドラインでのビルド方法です。
まずqmake
コマンドで、QtからiOSプロジェクトの出力を行ないます。
$ /Applications/Qt/5.3/ios/bin/qmake -r
これでiOS向けプロジェクト(Xcodeプロジェクト)と、上記構成のプロジェクトであれば下記4種類のMakefileが生成されます。
続いてビルドターゲットに応じたMakefileを指定してmakeを実行します。
$ make -f Makefile.ReleaseDevice
ReleaseDevice
の場合、ビルドはRelease-iphoneos/HelloWorld.app/に出力されます。
ipaファイルの生成
.appからipaファイルの生成は、xcrun
コマンドを使用します。生成されたipaファイルはそのままXcodeのオーガナイザやiTunesで端末にインストールしたり、TestFlightにアップロードすることが可能です。
$ xcrun -sdk iphoneos PackageApplication Release-iphoneos/HelloWorld.app -o $(PWD)/HelloWorld.ipa
iostoolコマンドでのインストール
Qt Creatorのiostoolによるインストール方法について、@IoriAYANEさんに頼まれた内容の確認を行ないましたが現在まだ成功していません。
端末UDIDの取得
端末をUSB接続した状態で下記コマンドを実行すると、端末のUDIDが取得できるようです。
$ /Applications/Qt/Qt\ Creator.app/Contents/Resources/ios/iostool -device-info
実行結果は以下の通りです。
<?xml version="1.0" encoding="UTF-8"?>
<query_result>
<device_id>8af2b012d6ab166f897b91d8919c8812401c1fda</device_id>
<device_info>
<item>
<key>developerStatus</key>
<value>Development</value>
</item>
<item>
<key>deviceConnected</key>
<value>YES</value>
</item>
<item>
<key>deviceName</key>
<value>Koji Hasegawa の iPhone 5s</value>
</item>
<item>
<key>osVersion</key>
<value>7.1.2 (11D257)</value>
</item>
</device_info>
<exit code="0"/>
</query_result>
なお、UDID自体はiTunesでも確認できますし、ビルドする前にプロビジョニングプロファイルに紐付ける必要もあるので、このタイミングで取得することは稀だとおもいます。
端末へのインストール
下記コマンドでインストールできそうなのですが、うまく行っていません。
$ /Applications/Qt/Qt\ Creator.app/Contents/Resources/ios/iostool -device-id 8af2b012d6ab166f897b91d8919c8812401c1fda -bundle Release-iphoneos/HelloWorld.app -timeout 10000 -run
実行結果(エラー)は以下の通りです。
<?xml version="1.0" encoding="UTF-8"?>
<query_resultCommandSession ERROR: "failed to get app Path on device for bundle Release-iphoneos/HelloWorld.app with appId: com.nowsprinting.iostestautomationbook.HelloWorld">
<msg>TransferAppSession(8af2b012d6ab166f897b91d8919c8812401c1fda, Release-iphoneos/HelloWorld.app)failed to get app Path on device for bundle Release-iphoneos/HelloWorld.app with appId: com.nowsprinting.iostestautomationbook.HelloWorld
</msg>CommandSession ERROR: "Unexpected reply: ENo such file or directory () (454e6f20737563682066696c65206f72206469726563746f7279202829) vs OK (4f4b)"
<msg>TransferAppSession(8af2b012d6ab166f897b91d8919c8812401c1fda, Release-iphoneos/HelloWorld.app)Unexpected reply: ENo such file or directory () (454e6f20737563682066696c65206f72206469726563746f7279202829) vs OK (4f4b)
</msg>
<app_started status="FAILURE"/>
<exit code="0"/>
</query_result>
-bundle
に指定しているパス(.app)は存在し、メッセージ中のappIdはその.app下から読んでいるはずなので間違いないはず。
また、.appでなく上記xcrun
コマンドで生成した.ipaファイルを指定しても同様のエラーかつappIdが表示されません。
独自のInfo.plistを使用する
iOSアプリのメタ情報を管理するInfo.plistファイルは、qmake
コマンドで生成されます。この中のCFBundleIdentifier
などを書き換えたい場合、以下の手順で行ないます。
1.あらかじめ専用のInfo.plistファイルを別名で作成する(ここではHelloWorld-Info.plist)
2.HelloWorld*1.proファイルに以下を追記する
QMAKE_INFO_PLIST = HelloWorld-Info.plist
これで、qmake
でデフォルトのInfo.plistは生成されず、続くビルドでHelloWorld-Info.plistが使われます。
*1:プロジェクト名