読者です 読者をやめる 読者になる 読者になる

やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

QtのiOSアプリ生成を試してみた

Qt iOS

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もサポートされているようです。

f:id:nowsprinting:20140702060952p:plain

テンプレートを選択したら、プロジェクトの格納パスを決定します。

f:id:nowsprinting:20140702061036p:plain

続いてキットを選択します。ここでiphoneos(実機用)とiphonesimulator(シミュレータ用)を選択します。

f:id:nowsprinting:20140702061048p:plain

そのほか、テンプレートに応じた設定などを確認すると、Qtプロジェクトが作られます。

Qtプロジェクトのビルド(IDE

そのままQt Creatorでアプリのビルドを実行してみます。 まず、メニューの[ビルド]->[ビルド/実行キットセレクタを開く…]を選択して下記ウィンドウを出し、キット=iphonesimulator、ビルド=デバッグを選択します。

f:id:nowsprinting:20140702063409p:plain

続いてメニューの[ビルド]->[実行]でビルド、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:プロジェクト名