TestFlightみたいなのを
自作する
デジタルサーカス(株)長谷川智希
長谷川智希
とも き
@tomzoh

とむぞう
開発系趣味
その他趣味
Webサイト開発, iOSアプリ開発
レンタルカートレース, 電子工作(mbed), …
TOMZOH
お仕事 スマホアプリ受託開発 Mgr
デジタルサーカス(株) 副団長CTO
Facebook CakePHP iOS
デジタルサーカス(株)
・ Webサイト受託開発
・ スマホアプリ受託開発



・ 自社サービス
(PHP, Drupal, CakePHP)
(iOS, Android)



(http://appbuilder.jp)
Twitter: @tomzoh
Twitter: @tomzoh
今日のテーマ:
TestFlightみたいなのを
自作する
アプリ受託開発
お客さま企業 ご担当者様
PM
デザイナ iOS Android Web
アプリユーザ
体制
弊社のアプリ開発のステップ
要件定義・設計
開発
テスト
アプリ申請
ご確認/最終化
• アプリの完成に対してコミットする
契約。
• ウォーターフォール気味にプロジェ
クト進行する必要がある。
• とは言いつつ紙で「要件定義」して
も実際に動かしてみたら「ちょっと
違ったね😓」というのはある。
• 開発・テスト後に実際にお客さまに実
際に触って頂いて、手触り感の確認、
修正を繰り返す。(最終化)
弊社のアプリ開発のステップ
要件定義・設計
開発
テスト
アプリ申請
ご確認/最終化
弊社のアプリ開発のステップ
要件定義・設計
開発
テスト
アプリ申請
ご確認/最終化
バイナリ
作成&配布
弊社のアプリ開発のステップ
要件定義・設計
開発
テスト
アプリ申請
ご確認/最終化
動作確認
バイナリ
作成&配布
弊社のアプリ開発のステップ
要件定義・設計
開発
テスト
アプリ申請
ご確認/最終化
動作確認
プログラム
修正
バイナリ
作成&配布
弊社のアプリ開発のステップ
要件定義・設計
開発
テスト
アプリ申請
ご確認/最終化
動作確認
プログラム
修正
バイナリ
作成&配布
iOSアプリ配布プラットフォーム
• 2009∼ メール配布
• 「UDIDの調べ方🔎」「iTunesにドラッグ&ドロップします」的
な手順書。
• 個人所有の端末を同期しちゃって端末が真っ白になる事故😱
• 2010∼ TestFlight
• 「更新版アップしました」「確認しました」大分便利😇
• 「TestFlight導入手順書」😕
• 2011∼ InHouse配布
InHouse配布
iOSのアプリ配布
• AppStore経由で配布する配布
• (Appleの)TestFlightもこれ。
• iTunesやiPhone構成ユーティリティを使って、

ケーブル経由でインストールする
• 独自に構築したWebサイトから通信回線経由で

配布する。
iOSのアプリ配布
• AppStore経由で配布する配布
• (Appleの)TestFlightもこれ。
• iTunesやiPhone構成ユーティリティを使って、

ケーブル経由でインストールする
• 独自に構築したWebサイトから通信回線経由で

配布する。
InHouse配布
iOS InHouse配布の仕組み
plistファイル

配布サーバ
バイナリ配布サーバ
iOS端末
iOS InHouse配布の仕組み
plistファイル

配布サーバ
バイナリ配布サーバ
iOS端末
①plistファイルを取得
iOS InHouse配布の仕組み
plistファイル

配布サーバ
バイナリ配布サーバ
iOS端末
①plistファイルを取得
②plistファイルから

ipaのURLを取得
iOS InHouse配布の仕組み
plistファイル

配布サーバ
バイナリ配布サーバ
iOS端末
①plistファイルを取得
②plistファイルから

ipaのURLを取得
③ipaファイルを
取得してインストール
HTMLからplistファイルへのリンク
<a href=‘itms-services://?action=download-
manifest&url=https://path/to/plist/foo.plist'>
  <span class=‘title’>2015/06/30_2版 (2回⽬目)</span>
  <span class=‘comment’>2015/06/30(Pre)</span>
</a>
HTMLからplistファイルへのリンク
<a href=‘itms-services://?action=download-
manifest&url=https://path/to/plist/foo.plist'>
  <span class=‘title’>2015/06/30_2版 (2回⽬目)</span>
  <span class=‘comment’>2015/06/30(Pre)</span>
</a>
固定
HTMLからplistファイルへのリンク
<a href=‘itms-services://?action=download-
manifest&url=https://path/to/plist/foo.plist'>
  <span class=‘title’>2015/06/30_2版 (2回⽬目)</span>
  <span class=‘comment’>2015/06/30(Pre)</span>
</a>
固定 plistファイルのURL
HTMLからplistファイルへのリンク
<a href=‘itms-services://?action=download-
manifest&url=https://path/to/plist/foo.plist'>
  <span class=‘title’>2015/06/30_2版 (2回⽬目)</span>
  <span class=‘comment’>2015/06/30(Pre)</span>
</a>
https://
iOS7以上でhttps必須
<?xml version="1.0" encoding="UTF-8"?>
<!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>http://example.com/path/to/ipa/foo.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.example.foo</string>
<key>bundle-version</key>
<string>3.1.2</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
</dict>
</dict>
</array>
</dict>
</plist>
plistファイル
<?xml version="1.0" encoding="UTF-8"?>
<!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>http://example.com/path/to/ipa/foo.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.example.foo</string>
<key>bundle-version</key>
<string>3.1.2</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
</dict>
</dict>
</array>
</dict>
</plist>
plistファイル
<?xml version="1.0" encoding="UTF-8"?>
<!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>http://example.com/path/to/ipa/foo.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.example.foo</string>
<key>bundle-version</key>
<string>3.1.2</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
</dict>
</dict>
</array>
</dict>
</plist>
plistファイル
<key>url</key>
<string>http://example.com/path/to/ipa/foo.ipa</string>
<?xml version="1.0" encoding="UTF-8"?>
<!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>http://example.com/path/to/ipa/foo.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.example.foo</string>
<key>bundle-version</key>
<string>3.1.2</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
</dict>
</dict>
</array>
</dict>
</plist>
plistファイル
<?xml version="1.0" encoding="UTF-8"?>
<!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>http://example.com/path/to/ipa/foo.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.example.foo</string>
<key>bundle-version</key>
<string>3.1.2</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
</dict>
</dict>
</array>
</dict>
</plist>
plistファイル
<?xml version="1.0" encoding="UTF-8"?>
<!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>http://example.com/path/to/ipa/foo.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.example.foo</string>
<key>bundle-version</key>
<string>3.1.2</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
</dict>
</dict>
</array>
</dict>
</plist>
plistファイル
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
<?xml version="1.0" encoding="UTF-8"?>
<!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>http://example.com/path/to/ipa/foo.ipa</string>
</dict>
</array>
<key>metadata</key>
<dict>
<key>bundle-identifier</key>
<string>com.example.foo</string>
<key>bundle-version</key>
<string>3.1.2</string>
<key>kind</key>
<string>software</string>
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
</dict>
</dict>
</array>
</dict>
</plist>
plistファイル
<key>title</key>
<string>2015/08/31 (API:xxxx)【ver1.0.1】</string>
InHouse配布システム@デジタルサーカス
• プロジェクトごとに割り当てた特
定のURLをiPhoneで開くとアッ
プされたアプリの一覧を表示。
• タップでインストール👍
InHouse配布システム@デジタルサーカス
• プロジェクトごとに割り当てた特
定のURLをiPhoneで開くとアッ
プされたアプリの一覧を表示。
• タップでインストール👍
InHouse配布システム@デジタルサーカス
• Subversionの特定リポジトリに
ipaをコミットすると一覧として
表示。
• ファイル名からタイトルを生成。
• コミットログをコメントとして表
示。
まとめ
まとめ
• InHouse配布を使うとTestFlightみたいなのを簡単
に作れる。
• HTMLからXML形式のplistファイルに itms-services://
でリンクする。  
• plistにipaのパスが書いてある設計。
• ipaのURLはhttpsの必要あり。
ありがとうございました
@tomzoh
デジタルサーカス(株)
声かけてください
We re hiring!!
Future Works
• ビルド自動化したい😓
• 今は自動化そのものはかんたん。
• ソースを特定のブランチにPUSHしたらビルド。
• アプリの設定を自動表示したい
• 使っている証明書, APIの向き前, Bundle ID, Version, Build
• 新規プロジェクト開始時の設定を簡単にしたい😕
• App ID, 証明書の作成, PUSH通知用証明書の作成。
OSSで良いのがあったら教えてください。
参考: 認証ダイアログ
• EnterpriseのProvisioningProfileで
署名したバイナリをインストールし、
実行すると認証ダイアログが表示され
る。
• iOS9では[信頼]ボタンが表示されず、
設定.app → 一般 → プロファイルか
ら明示的に信頼設定する必要アリ。

TestFlightみたいなのを自作する