AppMill
  • ESTIM
    • ESTIMの特徴
    • ESTIMの使い方
    • 発注フロー
    • リリースまでの流れ
    • パーツ(機能)一覧
  • かんたん見積
  • 活用方法
  • Q&A
    • 契約・発注について
    • 開発について
    • ESTIMについて
  • メディア
  • お問い合わせ
  • Latest
  • 画面設計書
  • 要件定義
  • インタビュー
  • ディレクター
  • 仕様書
  • オフショア開発
  • trigger 
  • Crashlytics
  • Python
  • Fabric
  • Fastfile
  • Appfile
  • bundle id
  • Production Certificates 
  • Development Certificates 
  • Provisioning profile
  • LinterBot
  • YAMLファイル
  • Github
  • .xcconfig 
  • システムの環境
  • Cocoa pod
  • Gemfile
  • Bundle
  • Fastlane
  • Swiftlint
  • Travis CI
  • IOSプロジェクト
  • CI/CD
media-background

CI上でCertificateとProvisioning Profileを設定します

  • Travis CI
  • Provisioning profile
  • Development Certificates 
  • Production Certificates 
  • bundle id
person-image

ビン太郎

2020-07-13 16:09:17

Content

  1. 1.  Certificate と Provisioning profile
    1. 1.1. Certificates
    2. 1.2. App IDs, Device and Provisioning Profile
  2. 2. CIにCertificateおよびProvisioning を追加します
  3. 3. 説明
  4. 4. まとめ

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です。

例えば:アプリ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プロジェクトをビルドします。

  • 自動的ビルドとアプリ配布を準備します。

  • Travis CI
  • Provisioning profile
  • Development Certificates 
  • Production Certificates 
  • bundle id

関連記事

  • images-author ビン太郎

    Travis CIでiOSアプリのビルドトリガー

    2020-07-13 16:11:10
  • images-author ビン太郎

    FabricでiOSアプリケーションをデプロイする

    2020-07-13 16:10:20
  • images-author ビン太郎

    Fastlaneの概観

    2020-07-13 16:09:18
  • 運営会社

    • 株式会社Enlyt
    • Tel : 03-6555-3667
    Enlyt公式サイト
    • ESTIMの特徴
    • ESTIMの使い方
    • 発注フロー
    • リリースまでの流れ
    • パーツ(機能)一覧
    • かんたん見積
    • 活用方法
    • メディア
    • 契約・発注について
    • 開発について
    • ESTIMについて
ESTIM
  • ESTIM
  • かんたん見積
  • 活用方法
  • Q&A
  • メディア
お問い合わせ
  • All Right Reserved
  • Privacy Policy