web-dev-qa-db-ja.com

xcodebuildは自動署名を管理できますか?

SUMMARY:

「署名の自動管理」を有効にして新しいバンドルIDを使用してXcode 8でプロジェクトを開くと、そのプロジェクトのプロビジョニングプロファイルが自動的に作成およびダウンロードされます。しかし、どのようにしてxcodebuildでも同じことを実現できるので、リモートビルドサーバーで使用できますか?

詳細:

MacでCordovaアプリを構築しようとしています。 Cordovaは、「署名の自動管理」を使用するようにXcodeプロジェクトを構成するため、それを使用しようとしています。

バンドルIDを頻繁に変更するので、Cordovaが新しいバンドルIDを使用してビルドできるようにしたいのですが、これはまだ使用されていません。

しかし、cordova build ios --release --device --buildConfig build.jsonを実行すると、戻りコード65と次のエラーが表示されます。

Check dependencies
No profiles for 'com.my.bundle.id' were found:  Xcode couldn't find a provisioning profile matching 'com.my.bundle.id'.
Code signing is required for product type 'Application' in SDK 'iOS 10.3'

** ARCHIVE FAILED **

The following build commands failed:
    Check dependencies
(1 failure)
Error: Error code 65 for command: xcodebuild with args: -xcconfig,/cordova-project/platforms/ios/cordova/build-debug.xcconfig,-workspace,MyApp.xcworkspace,-scheme,MyApp,-configuration,Debug,-destination,generic/platform=iOS,-archivePath,MyApp.xcarchive,archive,CONFIGURATION_BUILD_DIR=/cordova-project/platforms/ios/build/device,SHARED_PRECOMPS_DIR=/cordova-project/platforms/ios/build/sharedpch

(私は手動でそのxcodebuildコマンドを実行して同じエラーを受け取ることができるので、おそらくCordovaの問題ではありません。)

私のbuild.jsonファイルは次のようになります。

{
    "ios": {
        "debug": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "MY_TEAM_ID",
            "packageType": "development"
        },
        "release": {
            "codeSignIdentity": "iPhone Developer",
            "developmentTeam": "MY_TEAM_ID",
            "packageType": "enterprise"
        }
    }
}

Cordova 7.0.1、cordova-ios 4.4.0、Xcode 8.3.3、およびMacOS 10.12.5を使用しています。 Apple Enterpriseアカウント。

私が試したもの:

生成されたプロジェクトをXcodeで開くと、自動署名が修正され、それ以降、そのバンドルIDでcordovaを正常に実行できます。しかし、別のバンドルIDで実行しようとすると、再び失敗します。

security unlock-keychain ~/Library/Keychains/login.keychain-dbを最初に使用してみました。これは過去に機能していたので、助けにはなりませんでした。

また、キーチェーンアクセスで秘密署名キーを開き、「すべてのアプリケーションにこのアイテムへのアクセスを許可する」に設定してみましたが、うまくいきませんでした。

--debugまたは--releaseをcordovaに渡しても、同じエラーが発生します。

36
JW.

これはXcode 8では直接サポートされていません。Xcode9では、-allowProvisioningUpdatesをxcodebuildに渡すことができ、追加のツールを必要とせずに、Xcode UIと同様に自動署名が機能します。

例えばcordova run ios --buildFlag="-allowProvisioningUpdates"

16
itai195

Automatically manage signingの場合、 Fastlane を使用できます。インストールとセットアップは簡単です。

リモートビルドサーバーで使用する場合は、 Jenkins を使用できます。

ここの例 リモートマシンにJenkinsFastlaneでセットアップする必要があります。 Jenkinsよりもrepository threadをチェックするか、単にコマンドを実行するだけです。その後、Jenkinsを実行して、リモートビルドサーバーでFastlaneを実行します。そして、Fastlaneは、Fastfileで記述したすべての証明書とその他のセットアップを作成します。

展開証明書が1つしかない場合は、FastlaneというMatchサービスを使用できます。

Gitを使用して、チーム全体で証明書とプロファイルを簡単に同期します

または、ローカルに送信してセットアップするだけです。

お役に立てば幸いです!

beta deployの例(私にとってはXcode 9で作業します):

 desc "Build devFoo and upload it to Fabric"
      lane :uploadToFabric do
        cocoapods
        cert(
        development: true,
        output_path: "./fastlane"
        )
        sigh(
        development: true,
        output_path: "./fastlane"
        )
        clear_derived_data
        gym(
        scheme: "Foo",
        configuration: "Debug",
        clean: true,
        output_directory: "./fastlane",
        )
        crashlytics(
        api_token: "foofoofoofoo",
        build_secret: "foofoofoofoo",
        emails: ["[email protected]"],
        notifications: true
        )
        slack(
        message: "New build for test successfully deployed in Fabric",
        success: true
        )
      end

リリースデプロイの例を次に示します。

desc "Build and upload it to the AppStore and TestFlight"
  lane :uploadToAppStore do
    cocoapods

    cert(
    development: false,
    output_path: "./fastlane"
    )
    sigh(
    development: false,
    app_identifier: "foofoo",
    output_path: "./fastlane"
    )
    clear_derived_data
    gym(
    scheme: "Foo",
    configuration: "Release",
    clean: false,
    output_directory: "./fastlane",
    )
    deliver(
    force: true,
    app_identifier: "foo",
    skip_metadata: true,
    skip_screenshots: true,
    submit_for_review: false,
    skip_binary_upload: false
    )
    slack(
    message: "New build successfully deployed to AppStore",
    success: true
    )
    upload_symbols_to_crashlytics(dsym_path: "./fastlane/foo.app.dSYM.Zip")
    slack(
    message: "dSYM symbolication files uploaded to Crashlytics",
    success: true
    )
5
S. Matsepura

答えはイエスです。私が使用したことと確認できることは機能しており、素晴らしいです:

https://fastlane.tools/

すべてが自動になるように設定できます。

  1. 署名キー
  2. スクリーンショットを撮る
  3. ITunesでアップロードする

他の多くのもの

バックグラウンドでは、xcodebuildコマンドラインを使用しています。私はこのようなことが可能であることに懐疑的でしたが、ただセットアップして、始めて、楽しんでください。

5
mommcilo

Fastlaneを使用して実行できます。

https://fastlane.tools/

cert:利用可能な最新のコード署名IDを取得または生成します

sigh:プロビジョニングプロファイルを生成します。プロファイルを現在のフォルダーに保存します

ps:CIサーバー(たとえばjenkins)から実行している場合は、ログインキーチェーンのロックを解除する必要があります。

security unlock-keychain -p PASSWORD /Users/YOUR-USER/Library/Keychains/login.keychain

Fastfile内の例:

cert(
  development: true,
)

sigh(
  development: true,
  app_identifier: "YOUR_APP_IDENTIFIER"
)

基本的なFastfileの例を次に示します。

fastlane_version "2.27.0"
default_platform :ios

platform :ios do

lane :beta do
   cert
   sigh
   gym
end

error do |lane, exception|
  puts "Got an error! #{exception.error_info.to_s}"
end

end
4

私の理解と最近の読書に関する限り、OPの質問への答え:

xcodebuildは自動署名を管理できますか?」 「はい」ですが、「アプリIDまたはプロビジョニングプロファイルをまだ作成しておらず、Xcodeのように自動的に作成したい場合」の行のOPの期待どおりではありません

このように、xcode8および自動コード署名の 情報提供ブログ には、次のように明記されています。

「たとえば、App Storeで署名されたIPAを作成する場合、Macでは、ワイルドカード、チーム/開発、およびApp Store配布証明書とプロビジョニングプロファイルの両方が必要です!」

したがって、アプリIDとプロビジョニングプロファイルは自動作成されません。 Fastlaneはこの問題の回避策かもしれませんが、私はそれがOPの期待ではないと思います。それが理にかなっていることを願っています。

3
Gandhi

xcodebuildを使用して署名を自動的に管理する方法はありません。前述のFastlaneなどのサードパーティを使用するか、前述のように手動コード署名を使用する必要があります here

3
Vahan Babayan

他のいくつかの答えが既に述べたように、あなたが探しているのはFastlaneと呼ばれるリリース自動化ツールです。 https://fastlane.tools/

あなたがそれに慣れていないなら、始めるのに最適な場所はraywenderlichのfastlaneチュートリアルだと思います。

https://www.raywenderlich.com/136168/fastlane-tutorial-getting-started-2

3
sleepwalkerfx

注意:この回答は、バンドルIDとプロビジョニングプロファイルが手動で作成されることを前提としています。この方法を使用して自動化できるのはビルドプロセスのみです。

はい、サードパーティのツールを使用しなくても可能です。スクリプトファイルまたはメイクファイルの使用に慣れている必要があります。私は仕事中のMac Miniのメイクファイルで2行のコードを使用しています。そして、それは私たちの設定に従ってアップロードの準備ができているad-hocまたはappstoreバージョンを提供します。

  1. プロジェクトで自動構成が有効になっていることを確認してください。
  2. リモートMacで、すべての歌唱証明書とプロビジョニングがダウンロードされていることを確認してください。この場合、私はいつも最初の建物でXcodeを開き、リモートマシンでビルドしてエクスポートします。それが機能する場合、何も欠けていません。ただし、歌唱証明書へのアクセスを常に許可するようにしてください。 Xcodeはまた、最初のビルドを要求します。そうしないと、ポップアップがリモートサーバーに表示され、誰かが署名証明書へのアクセスを許可するまで待機します。
  3. 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>teamID</key>  
  <string>MY_TEAM_ID_XXYY</string> //put your iPhone distribution team ID. in my case developer team ID is different than my distribution team ID. just wondering.
  <key>method</key>  
  <string>app-store</string> // for appstore upload or use <string>ad-hoc</string> for ad-hoc  
  <key>uploadSymbols</key>  
  <true/>  
  <key>uploadBitcode</key>  
  <true/>  
</dict>  
</plist>

Plistの設定はアクセス可能な場所に保存する必要があります。たとえば、options.plistのように、リモートMacにアドホック/配信プロビジョニングプロファイルがあることを確認してください。

  1. xcodebuildはアーカイブを作成し、.appをエクスポートできます。メイクファイルまたはスクリプトファイルでは、次の行を使用します。

4.1。まず、アーカイブファイルを作成します。

xcodebuild archive -derivedDataPath build/ -project myProject.xcodeproj -scheme myScheme -archivePath build/ios/myProject.xcarchive

derivedDataPathパラメーターは、アプリのビルド後に削除できる単なるフォルダーです。派生データで生成されるジャンクの量を知っています。 project nameはプロジェクト名であり、scheme nameはXcodeのplay|stopボタンの直後です。次のステップのために、アーカイブ名とパスを選択する必要があります。

4.2アーカイブが正常に構築されたら、次のコードを使用してアプリを作成します。

xcodebuild -exportArchive -archivePath build/ios/myProject.xcarchive -exportPath build/ios/ -exportOptionsPlist build/ios/options.plist

ここでは、前の手順で使用したアーカイブ名とパスを使用します。 exportOptionsPlistは、ステップ3で作成したplist構成のパスと名前を知っている必要があります。

以上です!これらのコマンドは、アプリをビルドするターミナルウィンドウで実行できます。これらの2行をスクリプトファイル/ makefileに入れて、プロジェクト名、パス、options.plistの変数を使用し、それを使用してすべてのアプリをビルドできます。

PS:不明な点がある場合はお知らせください。説明を追加します。

3
Hashmat Khalil

Xcodebuildを使用してxCodeプロジェクトをアーカイブし、xCode 9をインストールしている場合、次のFLAGSをコンパイルコマンドに提供できます。

CODE_SIGN_STYLE="Manual" \
DEVELOPMENT_TEAM="" \

自動署名をfalseに設定し、開発チームを空に設定します。必要な値を設定できます。例えば:

xcodebuild \
-scheme "your_scheme" \
-sdk iphoneos \
-archivePath "/Users/youruser/Developer/Jenkins/Home/customWorkspace/folder/platforms/ios/build/device/yourproject.xcarchive" \
-configuration Release \
-allowProvisioningUpdates \
CONFIGURATION_BUILD_DIR="/Users/youruser/Developer/Jenkins/Home/customWorkspace/folder/platforms/ios/build/device" \
CODE_SIGN_IDENTITY="your code sign identity" \
PROVISIONING_PROFILE="your provisioning profile" \
CODE_SIGN_STYLE="Manual" \
DEVELOPMENT_TEAM="" \
archive

次に、-exportArchiveでipaを作成できます。必要に応じてipaが作成されます

1
mgarciaibanez