2013年8月8日

【Jenkins】iPhoneアプリをWi-Fiでインストール



アプリでJenkinsをビルドしたら、そのままiPhoneへインストールしたいので、
TestFlight的な何かを作ってみました。

作るために必要となる知識をまとめてみました。



ビルド



iPhoneのアプリのビルドをしますが、
ビルドする際にiPhoneが登録してあるProvisioning Profileでビルドします。

また、.ipa形式までビルドします。


JenkinsにはXcode Pluginがあるので、そちらを使ってもいいですし、
以前、

【iPhone】Jenkins CIで自動ビルド

という記事も書いているので、そちらのシェルをコピーしてもビルド出来ます。

ビルドが終われば.ipa形式のファイルが出来上がります。


ビルド結果一覧


Jenkinsでビルドされたビルド結果は、

/path/to/.jenkins/jobs/ProjectName/builds

にあります。
ビルド番号と時間のディレクトリがあり、
番号は時間へのシンボリックリンクです。

なので、番号一覧だけ取得すれば、ビルド一覧になりますので、

ls -F /path/to/.jenkins/jobs/ProjectName/builds | grep @ | awk -F '\@' '{print $1}'

とすると、ビルド番号のみ取得出来ます。


アプリ一覧取得



ビルド番号を指定したら、そのビルドでビルドされた.ipa一覧を取得します。

ls -R builds/100/archive/ | awk '/:$/&&f{s=$0;f=0} /:$/&&!f{sub(/:$/,"");s=$0;f=1;next} NF&&f{ print s"/"$0 }' | grep '\.ipa'

とすると、ビルド番号100番の.ipa一覧が取得出来ました。


CFBundleIdentifierとCFBundleDisplayNameの取得


インストール用のplistを作成しないといけないので、
plist作成の為に.ipaのCFBundleIdentifierとCFBundleDisplayNameを取得します。

unzip -o {ipa_file} -d {unzip_dirname}

で、ipaファイルを解凍し、
.appディレクトリ内のInfo.plistに対して、

/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "{PlistFileName}"

と、

/usr/libexec/PlistBuddy -c "Print :CFBundleDisplayName" "{PlistFileName}"

を実行すれば、アプリ名とBundle IDが取得出来ます。


インストール用Plist作成


.apkと違い、.ipaはそのままではリンクにしてもインストール出来ないので、plistを作成します。

名前は何でも大丈夫です。

ファイルのipaのURL、Bundle ID、タイトルは書き換えて下さい。

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>items</key>
  <array>
    <dict>
      <key>assets</key>
      <array>
        <dict>
          <key>kind</key>
          <string>software-package</string>
          <key>url</key>
          <string>{INSTALL_IPA_URL}</string>
        </dict>
      </array>
      <key>metadata</key>
      <dict>
        <key>bundle-identifier</key>
        <string>{BUNDLE_ID}</string>
        <key>kind</key>
        <string>software</string>
        <key>title</key>
        <string>{DISPLAY_NAME}</string>
      </dict>
    </dict>
  </array>
</dict>
</plist>


リンク作成


ipaへのリンクを作成します

リンクは、

itms-services://?action=download-manifest&url={PLIST_FILE_URL}

というリンクをaタグで囲います。

成功すればインストールが開始されます。

インストールが開始されない場合は、URLのエスケープを疑って下さい。

疑うポイントはPlist内のURLと、itms-serviceで追加するURLの部分のエスケープです。


追記


Node.js - expressでインストール用プロジェクトは作ってあるのですが、
とても見せられるコードでは無い為、公開は控えております。