これでできる!iOSアプリ DeployGate配信自動化までの13ステップ

どうも、ギルドワークス 前川です。

さて、みなさーん、継続的インテグレーション(以下CI)してますかー!

さて、以前お伝えしたように、ギルドワークスでは、iOSの開発においても積極的なCIを行っています。

これは、特にリモート開発が多い環境では、正しいものを正しくつくる ために常に安定したベースラインで確認できる環境を作ることが、非常に重要だからです。

とはいえ、なかなかiOSの自動ビルドには越えなければ行けないハードルが多かったりします。 今回は、ある一つのiOSプロジェクトを作成してから、誰でも実機上で確認できるようになるまで(技術ベースで言うと、DeployGateを用いてAdhoc配信するまで)を、ざっと紹介したいと思います。

1. iOSアプリケーションを作成し、iOSアプリケーションをGithubにPushする

まずは、大前提ですね。作成しているアプリケーションを、GithubにPushします。

2. CircleCIにて、ビルドの設定を行う

続いて、CircleCIにて、該当プロジェクトをビルドするように設定します。 この辺りは、公式ドキュメントを参照してくださいませ。

CircleCIはGithub認証が必須ですが、Githubを利用している限りは、特に迷うことはないかと思います。

こんな感じで、選べるはずです。

ead596c5-51ef-49df-a973-edaeae6229b0

3. CircleCIにて、Experimental OptionのiOS Buildを有効にし、チャットにて、制限回避をお願いする

さて、そうするとCircleCIでは勝手にビルドが始まるのですが、このようになります。

da7b9d58-10a9-44df-8dd2-14c564569010

残念ながら、警告が出て、失敗・・・というかビルドが行われません。 これは、CircleCIはiOSに関してはまだExperimental(実験的)な機能という扱いであり、設定をしてやらないといけないからです。

というわけで、Project Settingから、iOSビルドをONにします。

a5ed097f-6dbf-48a4-bebb-89936799c883

さて、なんとそれだけではうまく行きません。何かというと、、、

CircleCI is currently offering beta access to our iOS build system. Please contact support if you would like access.

なんとサポートに連絡する必要があります。 とはいえ、ご心配なく。サポートは、実はとても簡単にアクセスできます。

a0596661-19f2-4f87-be11-1e76bbab850a

ここから、チャットでお願いしましょう!

スクリーンショット 2015-11-20 08.47.40

こんな感じの、シンプルな英語で大丈夫です。

4. Schemeを共有設定にする

さて、これでようやく、iOSビルドの準備が整いました、、とおもいきや、まだ成功しません。Build Schemeを共有しなければなりません。

XCodeで、[Product] -> [Edit Scheme…] と選択し、Schemeの編集画面に行きます。

ここでSchemeを共有しておきます。

06c01938-899f-41c0-9e06-1c19369ebf40

これで、CircleCI上でのビルドが回り始めたはずです!

6. circle.yml を導入

とはいえ、実はCircleCIのデフォルトはXCodeのバージョンがかなり低いため、設定を行わないとビルドは成功しません。 画面からでも設定はある程度行えるのですが、設定ファイルとしてレポジトリに入れるほうが、バージョン管理もできますし、好ましいです。

ということで、circle.yml といわれる設定ファイルを追加します。

レポジトリのrootに circle.ymlを置いておくことで、CircleCIが勝手にその内容を読み取り、ビルドしてくれます。

詳しい書き方は、以下を参考にするとよいでしょう。

ここでは、ひとまずXCodeのバージョンを指定すれば良いので、以下のように書いておきます。

machine:
  xcode:
    version: "7.1"

これで、ビルドが通ったのではないでしょうか。


少し休憩

ここまでで、自動テストと、XCodeで設定してあれば、テストも通るようになります。現状、ベータアクセスのため一手間必要ではありますが、非常に簡単にビルドが行えることが、分かっていただけたでしょうか?

ただし、ここまではSimulator上での実行。ここからは、実機ビルドです。 そのためには、おなじみのApple Mamber Centerでの設定が必要となります。

6. Apple Member Center で Certificate を作成する

今回の実機配布は、DeployGateを利用する想定です。DeployGateはAdhocビルドの配布を行いますので、Certificateを作成する必要があります。

とはいえ、Certificate作成については、多くの先例があるため、紹介に留めます。

7. Apple Member Center で AppID を作成する

AppIDも同様に、先例の紹介に留めます。

8. Apple Member Center で Deviceを登録する

次に、テストを行う端末のDeviceIDを登録します。 DeviceIDを確認する手段は色々ありますが、まずは以下のように直接確認しましょう。

UDID自体は、iPhone をUSBにつなぎXcodeを起動 「Window」->「Devices」にIDが確認できます

from [iPhone] Provisioning Profile の作成

確認したUDIDと、それを識別する名前をセットにし、Member CenterのDevicesの中に追加します。

9. Apple Member Center で Provisioning Profile を作成する

こちらも定型です。

ただし、このProvisioning Profileは、Deviceが追加されるごとに書きなおす必要が有ることに注意しましょう。


もう一度休憩

ここまで設定すれば、手元でAdhoc配布用のビルドが作成できるようになっているはずです。

次にやることは、これをCircleCI上でやること。もう一息ですが、ここからが大変でもあります。頑張りましょう。


10. DeployGateでAPI Keyを取得する

まずは、DeployGateに登録し、API Keyを取得しておきます。 プロフィールページからいけますね。

ffe8196b-e3c0-431a-b371-30525c258689

11. 証明書キーファイル(p12ファイル)をレポジトリに入れる

次に、CircleCI上のMacでビルドするために、証明書をインストールする必要があります。いろいろ手段はあるかと思いますが、今回はp12ファイルをレポジトリに入れてしまいます。

p12ファイルはキーチェーンアクセスから暗号化することができますので、それを入れておけば最低限のセキュリティは担保できるでしょう。

上記はプッシュ通知用の作業ですが、手順としては同じです。これをレポジトリに入れましょう。

12. circle.yml を編集し、ビルド環境を整える

続いて、circle.yml を用いてビルド環境を整えます。 大きくやることは、

  1. cupertino の導入
  2. 証明書のインストール
  3. Certificateのインストール
  4. Provisioning Profileのインストール

の4つになります。

① cupertino の導入

cupertino とは、Member Centerにアクセスして CertificateやProvisioning Profileを取得してくれるコマンドラインツールです。

これを用いて、Apple Member Centerからビルド時にダウンロードします。 これは、Provisioning Profileがデバイスの追加ごとに再作成となるため、開発中は結構変わってしまうからです。リポジトリに入れてしまうと、管理が大変になります。

インストールは簡単です。circle.yml の依存関係解決後に、gemでインストールします

dependencies:
  post:
    - gem install cupertino

② 証明書のインストール

次に証明書のインストールです。ディレクトリ内に p12 ファイルは配置しているはずですので、それを展開します。

dependencies:
  post:
    - gem install cupertino
    - security import ./certificates/xxx.p12 -k "login.keychain" -P "${PRIVATE_KEY_PASSPHRASE}" -T /usr/bin/codesign

ここで、 ${PRIVATE_KEY_PASSPHRASE} で指定した環境変数だけは、誰にも知られたくありません。そんな環境変数は、CircleCIのSetting -> Environment Value から追加できます。パスワードなど外に漏れるとマズい情報はここに書きますね。

85630427-78c0-4865-bcfd-944958da4bca

③ Certificateのインストール

次に、Certificateです。Certificateについては、cupertinoを用いてダウンロードし、インストールします。

dependencies:
  post:
    - gem install cupertino
    - security import ./certificates/xxx.p12 -k "login.keychain" -P "${PRIVATE_KEY_PASSPHRASE}" -T /usr/bin/codesign
    - ios ios profiles:download "provision_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - security import "cert_name.cer" -k "login.keychain" -T /usr/bin/codesign

④ Provisioning Profile のインストール

最後に、Profile です。こちらもCertificateとほぼ同様ですね。

dependencies:
  post:
    - gem install cupertino
    - security import ./certificates/xxx.p12 -k "login.keychain" -P "${PRIVATE_KEY_PASSPHRASE}" -T /usr/bin/codesign
    - ios ios profiles:download "provision_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - security import "cert_name.cer" -k "login.keychain" -T /usr/bin/codesign
    - ios profiles:download "profile_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - cp "profile_name.mobileprovision" "$HOME/Library/MobileDevice/Provisioning Profiles"

これで、ビルドするための環境が整いました。

13. circle.yml を編集し、schenzenを用いてipa build を行い、DeployGateに配信する

最後に、テスト成功時にはパッケージビルドをして、DeployGateに送信しましょう。

これには、 schenzen というコマンドラインツールを使います。

schenzenは

  • ipaファイル(iOSにデプロイされる元ファイル)の作成
  • ipaファイルの各種サービスへの転送

を主に行うツールです。

テスト後、Deployにこれらのコマンドを用いたビルドをcircle.ymlに追記していきます。

deployment:
  staging:
    branch: master
    commands:
      - ipa build -w test.xcworkspace -s scheme_name -c Release -m "${profile_name.mobileprovision}" --sdk "iphoneos" --xcargs "CODE_SIGN_IDENTITY=\"CODE_SIGN_ID\"" --verbose
      - ipa distribute:deploygate -a $DEPLOYGATE_API_TOKEN -u $DEPLOYGATE_USER_NAME 

これがDeployの基本形で、上記はmaster branchにマージされたものを、自動的にビルドし、deploygateで送信しています。

デプロイの詳細な書き方は以下を参照ください。

ipaコマンドがschenzenです。 “CODE_SIGN_ID” というのは、キーチェーンアクセスで「情報を見る」などした時に表示される、”iPhone Distrobution: Guildworks.inc (XXXXXX)” のように、”サイン区分 + 会社名 + カッコつき数字”で記述されているものです。

さぁ、これでDeployGate配信までたどり着けるはずです。

最終的なcircle.ymlはこれくらいのボリュームになります。

machine:
  xcode:
    version: "7.1"
dependencies:
  post:
    - gem install cupertino
    - security import ./certificates/xxx.p12 -k "login.keychain" -P "${PRIVATE_KEY_PASSPHRASE}" -T /usr/bin/codesign
    - ios ios profiles:download "provision_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - security import "cert_name.cer" -k "login.keychain" -T /usr/bin/codesign
    - ios profiles:download "profile_name" -u "${user_id}" -p "${password}" --type distribution  --team "A_team"
    - cp "profile_name.mobileprovision" "$HOME/Library/MobileDevice/Provisioning Profiles"

deployment:
  staging:
    branch: master
    commands:
      - ipa build -w test.xcworkspace -s scheme_name -c Release -m "${profile_name.mobileprovision}" --sdk "iphoneos" --xcargs "CODE_SIGN_IDENTITY=\"CODE_SIGN_ID\"" --verbose
      - ipa distribute:deploygate -a $DEPLOYGATE_API_TOKEN -u $DEPLOYGATE_USER_NAME 

さて、長い記事にお付き合いいただきありがとうございました。 このように、けっこう大変ですが(順調に行けば1時間ちょっと、ハマると半日位かかってしまいますが)、1プロジェクトでやってしまえばあとは同じ作業で展開できますので、チャレンジしてもらえればなぁ、と思います。

このように、ギルドワークスではデプロイの徹底的な見直しを通じて、「正しいものを正しくつくる」を実現しようとしています。コーチや開発など、お手伝いできることがあればぜひ、お問い合わせください

iOS9 アプリ開発でのハマりどころ

どうも、ギルドワークス 前川です。

iOS 9 公開後一月ほどたちましたが、皆さんもうアップデートされているでしょうか?OSのアップデートはワクワクして楽しい半面、やはりアプリのつくり手としては思いもよらない不具合に遭遇したりすることもあるので、なかなか困り者です。

じつは私がiOSアプリ開発をはじめて、初めて本格的なバージョンアップを体験するのがこのタイミングでして、なかなか落とし穴にハマりましたので、色々共有させていただきたいと思います。

ハマりどころ① スプラッシュスクリーンがない場合の表示崩れ

まず最初に、ひどい目にあったのが本案件、スプラッシュスクリーンがない場合の画像崩れでした。

上記Qiita記事にもあるように、iOS9 / XCode7 で起動した場合に、黒帯が出てスクリーンが表示されない、という不具合に遭遇しました。

StackOverflowなども参照した結果、どうやらiOS9よりスプラッシュイメージを適切な画像サイズにするなり、ストーリーボードを指定するなりしないと画面崩れが発生するようになったようでした(画面サイズの検知に起動時の大きさを使うようになった、という情報を見かけました)

スプラッシュスクリーンなどただの飾りと思って油断していました。。。Appleのガイドラインを守らないものに振りかかる神罰、と言った感じですね。

ハマりどころ② Bitcode問題によりiTunes Connect にアプリがアップロードできない

iOS9から新たにAppThiningと呼ばれる、アプリの最適化が導入されました。

その中にBitcodeという項目が有ります。これは、アプリの中間コード(Bitcode)をアプリケーションに埋め込んで提供することで、Appleが各CPU向けの最適化を行ってくれるものです。そしてこの機能はデフォルトでONになっています。

しかしながら、cocoapodsCarthageなどのライブラリツールで外部ライブラリを取り込んでいる場合、そのライブラリがBitCodeオプションを有効化しているか、という問題に突き当たります(そして多くの場合有効化していません)。

この結果、せっかく時間をかけてビルドしたアプリがiTunes Connectで弾かれる、という悲しい自体になります・・・

スクリーンショット 2015-10-21 21.04.31

このように数多くのアプリが弾かれてしまいました。

解決方法は簡単で、Build SettingsEnable Bitcode をFalseにすればOKです。

ただ言うまでもなく、Bitcodeオプションは今後有効になるのが標準となるべきもので、CocoapodsやCarthageでも対応が進んでいます。できるだけ早く、有効にできるようになりたいですね。

ハマりどころ③ システムフォント変更におけるUI崩れ

これは特に英語対応をしている場合の要注意項目となります。

iOS9では、英語システムフォントが Helvetica Neue からSan Francisco に変更となっています。

上記記事から分かる通り、結構サイズもダイナミックに変わる、大きめの変更です。

従って、何も考えずにシステムフォントを指定している場合、OS毎にフォントの横幅が変わり、改行などの文字崩れが起きてしまいます。

カツカツのUI設計をしていると、ここで思わぬ折り返しが発生してしまい、泣くことになってしまいます。。。

最も大切なことはOS更新時期とリリース次期をかぶせないこと

今回の最大の教訓はこれです。OSの更新時期は、こういった思わぬトラブルに加え、AppleStoreの審査待ち渋滞も数多く発生します。ですので、できるだけOSの大型更新時期と、アプリのアップデートは分けるようなリリース計画にすべきですね。(新OS対応の特急申請などは割と通りやすい印象もありますし)

ここは神様に逆らってはいけない世界。色々と智慧をめぐらせ、Appleと賢く付き合っていきましょう。

リモートiOS開発成功の処方箋、早期のCI導入

どうも、ギルドワークス 前川です。京都からリモート作業を行っていますが、この二週間は、祇園祭でとんでもない人出となっております。

リモートでの開発に必要なもの

ギルドワークスでは、Webサービスだけでなく、iOSやAndroidの開発もリモートで行ってきています。その中で、最近一つのパターンとなっているのが「可能な限り初期に継続的ビルド(CI)を導入する」ことです。

もちろんCIは手段でしかありません。その目的は、「全員が同じものを見て確認する」ためです。対象がWebサービスならば、例えばHerokuにデプロイされたものを正として扱ってやれば、事は済みます。

しかしiOS開発では、そうはいきません。全員が「同じもの」を見ることが非常に重要ですが、それにはCIされた成果物を共通の場所においておき、それを参照する、これしかありません。

ここは結構厳格にやらなければいけない、と私は思ってます。例えばレビュー指摘をしても「ここは自分の環境では動いてますんで」などと言われると、そこで会話が止まってしまい、フィードバックが割と根本から絶たれてしまうのです。

「masterにpushされたものが唯一にして絶対の正」これを守るのは、簡単で、そしてもとても即効性のある、リモートiOS開発改善の処方箋なのです。

ギルドワークスが利用しているサービス:Circle CI

iOSのビルドはまだまだローカルJenkinsが主流だとは思いますが、リモートワークを掲げる当社としては、やはりCIを行ってくれるWebサービスを使用したいところです。

というわけで、ギルドワークスが利用しているサービスがCircle CIとなります。

Circle CIは”Experimental Setting(実験的な設定)”ながらもiOSのビルドを行うことができます。しかも、ビルド速度に制限はかかってしまうものの、Private レポジトリを含めて無料 でCIサービスを利用できます。

詳しい設定は、以下の公式ドキュメント(英語)をご覧ください。

iOSビルドの便利ツール、Schenzen

CircleCIでは、基本的にコマンドラインでビルドを実行していきます。

一応Xcodeにもxcodebuildというビルドツールが付属しているのですが、設定項目が結構多く、なかなか使いこなすのは大変です。また、iOSのファイル配布型式であるIPAファイルを作るのには、別のコマンドを色々叩く必要があり、大変です。

そんな時便利なのが、schenzenというコマンドラインツールです。

このツールを使えば、環境変数さえ適切に設定していれば、以下のように非常にシンプルなスクリプトで、ipaのビルドから、DeployGateなどのベータ配布サービスへの配信までやってくれます。

ipa build
ipa distribute

これらのサービスを活用して、ギルドワークスでは、以下の様なデプロイメントパイプラインを、手軽に組むことができています。

スクリーンショット 2015-07-14 18.45.01

これからのCIのトレンド

こういったギルドワークスでの取り組みを踏まえて、先日大阪の「CI勉強会」という勉強会で発表をしてきました。

タイトルは、「ポストJenkins時代のビルド戦略」

Jenkins一択時代から、色々なサービスを組み合わせる時代へ。今、結構大きな転換点が来ていると思っています。新しいツールやサービスとしっかり向き合って、自分たちの組織に最適な解を導きたいですよね。

もし、このようなCI周りの技術的悩みがおありなら、ギルドワークスにお気軽にお問い合わせください!

スタートアップ向けハイブリッドUIフレームワークの比較

はじめまして、水谷と申します。

Railsの開発をメインにやっているのですが、最近ではフロント部分の比率も増えてきており、Backbone.jsやAngularJSなどJavaScriptに関わったり、Hubot, Chef, Vagrant, AWSなどでインフラ関連もしたりしています。小さなチームでやることが多いので何でも屋的なエンジニアです。

はじめに

スタートアップのサービス立ち上げの開発に関ることが多く、ここのところデスクトップ向けの開発では、バックエンドにRailsを使い、フロントエンドにリッチなUIを提供できるようにAngularJSを採用するケースが多くなってきています。

一方で、これだけスマートフォンが普及しているとサービス開始と同時にモバイルアプリも提供したいというニーズをよく承けます。

ただ、スタートアップで限られたリソースでデスクトップ向けの開発と同時にネイティブアプリを開発していくのは非常に難しい場合が多いと思われます。

そこで、タッチ/マルチタッチイベントやスマートフォン特有のAPIを扱うためのフレームワークを導入して、HTML5ハイブリッドアプリを構築するのも一つの手ではないでしょうか。

ここでは、AngularJSを使ってHTML5ハイブリッドアプリを構築できるフレームワークの代表的な3つのフレームワークの比較をしていきたいと思います。

続きを読む

iOS 8リリースから見る新機能

上野です。

本日ついにiOS 8の一般公開が始まりました。
来週9月19日には iPhone 6 iPHone 6 Plus の発売開始も控えていますね。

iOS8

 

新機能は以下になります。

このアップデートでは、何百もの新しい機能が追加されました。主要な新機能は次の通りです:

  • メッセージの機能改善
  • 写真の機能改善
  • カメラの機能改善
  • QuickTypeキーボード
  • ヘルスケア
  • ファミリー共有
  • iCloud Drive
  • iPhone、iPad、およびMacでの作業がこれまで以上にシームレスになる連係機能
  • Spotlightの機能改善
  • メールの機能改善
  • Siriの機能改善
  • Safariの機能改善
  • マップの機能改善
  • App Storeの機能改善
  • マルチタスク表示から重要な連絡先にすばやくアクセス
  • メッセージ、メール、カレンダー、リマインダー、および他社製の対応Appのインタラクティブな通知
  • 新しい“ヒント”AppでiOSデバイスをさらに活用可能
  • iBooks AppをiOSに標準インストール。自動夜間モードや、ブックをシリーズごとにグループ化できる新機能
  • Podcast AppをiOSに標準インストール
  • Appごとのバッテリーの使用状況
  • iCloudキーチェーンで、保存されているWebサイトのパスワードを使って、関連Appに簡単にサインイン
  • FaceTimeオーディオで割込通話
  • “メモ”Appでリッチテキスト編集をサポート
  • ピア・ツー・ピアでAirPlayデバイスを検出して再生
  • エンタープライズ機能
  • アクセシビリティ機能
  • 中国向けの機能
  • 言語サポートの拡大
  • デベロッパ向けの新機能
  • バグの修正

http://support.apple.com/kb/DL1758?viewlocale=ja_JP

 

続きを読む