1. Certificate と Provisioning profile
1.1. Certificates
- Apple開発者のMembership ProgramではCertificates が身分証明書または運転免許証と見なすことができます。
- Appleの開発者のアカウント紐づいたアプリの開発またはリリース許可を認証するために、signing certificateをリクエスト、ダウンロードすることが必要です。
- Certificateは下記の形で保管されます:
- 公開鍵
- 秘密鍵
- Certificateを共有したいときに、Certificate(秘密鍵)を.p12ファイルとしてエクスポートする必要があります。 秘密鍵を紛失した場合、別のCertificateを最初から再作成することになります。
- 二つ種類のCertificateがあります:
- Development Certificates : アプリの開発用のCertificate. 二つ主な種類がある:
- iOS App Development: Development Certificateは、アプリの開発するプロセス中に使用され、開発環境にて実行またはデバッグすることに必要です。普段は開発チームの各開発者がCertificateを生成します。一人は四つまでが生成できます。
- Apple Push Notification service SSL (Sandbox): 開発環境にて指定したアプリIDへプッシュ通知を送信するためのCertificateです。
- Development Certificates : アプリの開発用のCertificate. 二つ主な種類がある:
例えば:アプリIDのcom.xxx.yyyにプッシュ通知を送信したい場合は,プッシュ許可が必要です,Certificateがプッシュサーバーにプッシュ許可として見られます。
- Production Certificates: アプリをリリースするためのCertificateです。下記の3つの種類がよく使われます。
- App Store and Ad Hoc: このCertificateを使用すると、App StoreまたはAdhocアカウントで利用可能なデバイスのリストへアプリを配布できます。
- Apple Push Notification service SSL (Production): Appleプッシュ通知サービスSSL(Sandbox)と同様に、このCertificateは本番環境のアプリにサーバープッシュ通知を許可します。
- In-House and Ad Hoc: このCertificateは、企業アカウントのみで使われます。Adhocや社内アプリなどのリリースを許可します(デバイス数に制限はなく、UUID必要がありません)。
1.2. App IDs, Device and Provisioning Profile
- App IDs : BundleIDと呼ばれることもあり、アプリを識別するためのユニークな文字列
- Devices: デバイスは、UUIDコードとともにdevアカウントに追加されます。 そうすれば、配布環境でアプリをビルドして、デバイスにアプリをインストールできます。
- Provisioning Profile:
- 以下の通り定義されます:
- Provisioning Profile = Certificate (DevelopmentまたはProduction) + App ID + Devices List (Adhocまたはdebug配布する場合).
- XcodeにAuto Signingのオプションをオンにすると自動的に生成されます。また、管理者以上のアカウントで手動で生成することもできます。
- 開発環境にのあるアプリの provisioning profileを作成するにはアプリID 、Certificate、デバイス一覧を選択する必要があります。
- Provisioning Profileの一部が無効になる場合はそのプロフィルが使用できません。
- たとえば、チームメンバーが自分のCertificateを取り消す場合はそのCertificateを含むすべてのプロビジョニングプロファイルが無効になります。 また、アプリIDを削除すると、関連するすべてのProvisioning Profileも削除されます。
- 以下の通り定義されます:
2. CIにCertificateおよびProvisioning を追加します
CIはサーバー上のMAC OSで実行され、その環境には何もインストールされていない前提です。CIでビルドに必要なすべてのものを手動で追加しなければいけません。
必要なファイルを準備する:
- プロジェクトのBundleIDでApp IDを生成します。
- 開発と配布環境のための二つCertificateを作成します。
- 公開キーは .cer のファイル
- 秘密キーは .p12 のファイル(パスワードが必要です)
- 二つの環境に二つのProvisioning Profileが必要。
- 次のようにXcodeを使用してプロジェクトをビルドおよびテストできるように、プロジェクトを再設定します。
- 自動サイニングをオフにする。
- ProvisioningとCertificateを使用します。
- Provisioningに該当する設定する値を選択します。
- コーディング
- CI設定用の他のスクリプトを管理するスクリプトフォルダーを作成する
- 上記のファイルをTravis CI仮想マシンに追加するスクリプトを作成します。 ./scriptsディレクトリにadd-key.shという名前のbashシェルを作成します
#!/bin/bash
KEY_CHAIN=ios-build.keychain
security create-keychain -p travis $KEY_CHAIN
# Make the keychain the default so identities are found
security default-keychain -s $KEY_CHAIN
# Unlock the keychain
security unlock-keychain -p travis $KEY_CHAIN
# Set keychain locking timeout to 3600 seconds
security set-keychain-settings -t 3600 -u $KEY_CHAIN
# Add certificates to keychain and allow codesign to access them
security import ./scripts/certs/dis.cer -k $KEY_CHAIN -T /usr/bin/codesign
security import ./scripts/certs/dev.cer -k $KEY_CHAIN -T /usr/bin/codesign
security import ./scripts/certs/dis.p12 -k $KEY_CHAIN -P YOUR_PASSWORD_CERT -T /usr/bin/codesign
security import ./scripts/certs/dev.p12 -k $KEY_CHAIN -P YOUR_PASSWORD_CERT -T /usr/bin/codesign
security set-key-partition-list -S apple-tool:,apple: -s -k travis ~/Library/Keychains/ios-build.keychain
echo "list keychains: "
security list-keychains
echo " ****** "
echo "find indentities keychains: "
security find-identity -p codesigning ~/Library/Keychains/ios-build.keychain
echo " ****** "
# Put the provisioning profile in place
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
uuid=`grep UUID -A1 -a ./scripts/profiles/TheLastProject_Dev.mobileprovision | grep -io "[-A-F0-9]\{36\}"`
cp ./scripts/profiles/TheLastProject_Dev.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid.mobileprovision
uuid=`grep UUID -A1 -a ./scripts/profiles/TheLastProject_AdHoc.mobileprovision | grep -io "[-A-F0-9]\{36\}"`
cp ./scripts/profiles/TheLastProject_AdHoc.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid.mobileprovision
#cp ./scripts/profiles/TheLastProject_Dev.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
#cp ./scripts/profiles/TheLastProject_AdHoc.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
echo "show provisioning profile"
ls ~/Library/MobileDevice/Provisioning\ Profiles
echo " ****** "
- Bashシェルを実施するために .travis.yml のファイルを編集します。
before_script:
- chmod a+x ./scripts/add-key.sh
- sh ./scripts/add-key.sh
コミットして、CIを待ちましょう!
Certification とProvisioning file を正常に追加したら次のようにCIログを表示できます。
CIがXcodeと同じくこれらのファイルを自動的に受信できるようにするには、ファイルを暗号化する必要があります。 上の画像のように、ファイル名はすでに暗号化されています。
3. 説明
- keychainを作成する
- KeychainはMacOSのCertificateとProvisioningを保存する場所です。
- MAC OS では ctrl + space のホットキーを使用して、なんにか調べたいときに簡単に見つけます。
- Keychainを1つ作成します:
- 名前: ios-build.keychain
- パスワード: travis
- ちゃんとコピーしない人に解除したい為にパスワードがあります
KEY_CHAIN=ios-build.keychain
security create-keychain -p travis $KEY_CHAIN
- Keychainをデフォルトにします。
# Make the keychain the default so identities are found
security default-keychain -s $KEY_CHAIN
# Unlock the keychain
security unlock-keychain -p travis $KEY_CHAIN
# Set keychain locking timeout to 3600 seconds
security set-keychain-settings -t 3600 -u $KEY_CHAIN
- Keychainで設定された属性
- デフォルト : まずMAC OSを探します
- それらのロックを解除して、アクセスするときにパスワードを入力する必要がないようにします
- タイムアウトは1時間で自己破壊します
- Certificate file を追加します
- フォルダに一つずつを追加します
- 二つの .p12は大切なものなので、追加します。二つのcertファイルは追加か,追加しないか,どちらでも大丈夫です。
- YOUR_PASSWORD_CERT は全てcert のファイルのパスワードです。
# Add certificates to keychain and allow codesign to access them
security import ./scripts/certs/dis.cer -k $KEY_CHAIN -T /usr/bin/codesign
security import ./scripts/certs/dev.cer -k $KEY_CHAIN -T /usr/bin/codesign
security import ./scripts/certs/dis.p12 -k $KEY_CHAIN -P YOUR_PASSWORD_CERT -T /usr/bin/codesign
security import ./scripts/certs/dev.p12 -k $KEY_CHAIN -P YOUR_PASSWORD_CERT -T /usr/bin/codesign
- ただし、時々MacOsでTravis CIを実行する場合、Certificateを追加できますが、実行できません
- その時は以下のURLで調べて,エーラを調査してください。 https://docs.travis-ci.com/user/common-build-problems/#mac-macos-sierra-1012-code-signing-errors
- keychainPass と keychainNameを注意して下さい
security set-key-partition-list -S apple-tool:,apple: -s -k keychainPass keychainName
- Provisioning profile を必要なディレクトリに移動する
- xcodeが必要とするため、Provisoning file をMD5で暗号化する必要があります
- 以下のコードを見てみましょう!
# Put the provisioning profile in place
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
uuid=`grep UUID -A1 -a ./scripts/profiles/TheLastProject_Dev.mobileprovision | grep -io "[-A-F0-9]\{36\}"`
cp ./scripts/profiles/TheLastProject_Dev.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid.mobileprovision
uuid=`grep UUID -A1 -a ./scripts/profiles/TheLastProject_AdHoc.mobileprovision | grep -io "[-A-F0-9]\{36\}"`
cp ./scripts/profiles/TheLastProject_AdHoc.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid.mobileprovision
Travis CIに下記の通りの結果がある場合は大丈夫です。これで、CI上のiOSプロジェクトのCertificateと Provisioning file の追加が完了しました。
$ sh ./scripts/add-key.sh
1 identity imported.
1 identity imported.
keychain: "/Users/travis/Library/Keychains/ios-build.keychain-db"
version: 512
class: 0x00000010
attributes:
0x00000000 <uint32>=0x00000010
0x00000001 <blob>="iOS Distribution: Tien Le"
0x00000002 <blob>=<NULL>
0x00000003 <uint32>=0x00000001
0x00000004 <uint32>=0x00000000
0x00000005 <uint32>=0x00000000
0x00000006 <blob>=0x573F5F26AAF3F17159F89AA601022169D9C4D28C "W?_&\252\363\361qY\370\232\246\001\002!i\331\304\322\214"
0x00000007 <blob>=<NULL>
0x00000008 <blob>=0x7B38373139316361322D306663392D313164342D383439612D3030303530326235323132327D00 "{87191ca2-0fc9-11d4-849a-000502b52122}\000"
0x00000009 <uint32>=0x0000002A "\000\000\000*"
0x0000000A <uint32>=0x00000800
0x0000000B <uint32>=0x00000800
0x0000000C <blob>=0x0000000000000000
0x0000000D <blob>=0x0000000000000000
0x0000000E <uint32>=0x00000001
0x0000000F <uint32>=0x00000001
0x00000010 <uint32>=0x00000001
0x00000011 <uint32>=0x00000000
0x00000012 <uint32>=0x00000001
0x00000013 <uint32>=0x00000001
0x00000014 <uint32>=0x00000001
0x00000015 <uint32>=0x00000001
0x00000016 <uint32>=0x00000001
0x00000017 <uint32>=0x00000001
0x00000018 <uint32>=0x00000001
0x00000019 <uint32>=0x00000001
0x0000001A <uint32>=0x00000001
keychain: "/Users/travis/Library/Keychains/ios-build.keychain-db"
version: 512
class: 0x00000010
attributes:
0x00000000 <uint32>=0x00000010
0x00000001 <blob>="iOS Developer: Tien Le (Tien Le)"
0x00000002 <blob>=<NULL>
0x00000003 <uint32>=0x00000001
0x00000004 <uint32>=0x00000000
0x00000005 <uint32>=0x00000000
0x00000006 <blob>=0xC3076BCF7A1B6AA8C739F5DE8D0E16A913DF7FD9 "\303\007k\317z\033j\250\3079\365\336\215\016\026\251\023\337\177\331"
0x00000007 <blob>=<NULL>
0x00000008 <blob>=0x7B38373139316361322D306663392D313164342D383439612D3030303530326235323132327D00 "{87191ca2-0fc9-11d4-849a-000502b52122}\000"
0x00000009 <uint32>=0x0000002A "\000\000\000*"
0x0000000A <uint32>=0x00000800
0x0000000B <uint32>=0x00000800
0x0000000C <blob>=0x0000000000000000
0x0000000D <blob>=0x0000000000000000
0x0000000E <uint32>=0x00000001
0x0000000F <uint32>=0x00000001
0x00000010 <uint32>=0x00000001
0x00000011 <uint32>=0x00000000
0x00000012 <uint32>=0x00000001
0x00000013 <uint32>=0x00000001
0x00000014 <uint32>=0x00000001
0x00000015 <uint32>=0x00000001
0x00000016 <uint32>=0x00000001
0x00000017 <uint32>=0x00000001
0x00000018 <uint32>=0x00000001
0x00000019 <uint32>=0x00000001
0x0000001A <uint32>=0x00000001
list keychains:
"/Users/travis/Library/Keychains/ios-build.keychain-db"
"/Library/Keychains/System.keychain"
******
find indentities keychains:
Policy: Code Signing
Matching identities
1) 86890D67F234745572B7EF153C72DEA7CF522EDE "iPhone Distribution: Tien Le (QG598U658S)"
2) 13F9C39BE0072902F6A60AF738F51BE53E3A8B23 "iPhone Developer: Tien Le (8PKL73LX5A)"
2 identities found
Valid identities only
1) 86890D67F234745572B7EF153C72DEA7CF522EDE "iPhone Distribution: Tien Le (QG598U658S)"
2) 13F9C39BE0072902F6A60AF738F51BE53E3A8B23 "iPhone Developer: Tien Le (8PKL73LX5A)"
2 valid identities found
******
show provisioning profile
3aec5b06-93af-4a41-bfa0-5060954f79c1.mobileprovision
a3c1f05a-550c-4986-a50a-4cc86886145c.mobileprovision
******
4. まとめ
-
CertificateとProvisioning File を使用して実行するiOSプロジェクトの設定。
-
Travis CIでCertificateとProvisioning File を使用するiOSプロジェクトをビルドします。
-
自動的ビルドとアプリ配布を準備します。