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に渡しても、同じエラーが発生します。
これはXcode 8では直接サポートされていません。Xcode9では、-allowProvisioningUpdatesをxcodebuildに渡すことができ、追加のツールを必要とせずに、Xcode UIと同様に自動署名が機能します。
例えばcordova run ios --buildFlag="-allowProvisioningUpdates"
Automatically manage signing
の場合、 Fastlane を使用できます。インストールとセットアップは簡単です。
リモートビルドサーバーで使用する場合は、 Jenkins を使用できます。
ここの例 リモートマシンにJenkins
をFastlane
でセットアップする必要があります。 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
)
答えはイエスです。私が使用したことと確認できることは機能しており、素晴らしいです:
すべてが自動になるように設定できます。
他の多くのもの
バックグラウンドでは、xcodebuildコマンドラインを使用しています。私はこのようなことが可能であることに懐疑的でしたが、ただセットアップして、始めて、楽しんでください。
Fastlaneを使用して実行できます。
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
私の理解と最近の読書に関する限り、OPの質問への答え:
「xcodebuildは自動署名を管理できますか?」 「はい」ですが、「アプリIDまたはプロビジョニングプロファイルをまだ作成しておらず、Xcodeのように自動的に作成したい場合」の行のOPの期待どおりではありません
このように、xcode8および自動コード署名の 情報提供ブログ には、次のように明記されています。
「たとえば、App Storeで署名されたIPAを作成する場合、Macでは、ワイルドカード、チーム/開発、およびApp Store配布証明書とプロビジョニングプロファイルの両方が必要です!」
したがって、アプリIDとプロビジョニングプロファイルは自動作成されません。 Fastlaneはこの問題の回避策かもしれませんが、私はそれがOPの期待ではないと思います。それが理にかなっていることを願っています。
xcodebuild
を使用して署名を自動的に管理する方法はありません。前述のFastlane
などのサードパーティを使用するか、前述のように手動コード署名を使用する必要があります here 。
他のいくつかの答えが既に述べたように、あなたが探しているのはFastlaneと呼ばれるリリース自動化ツールです。 https://fastlane.tools/
あなたがそれに慣れていないなら、始めるのに最適な場所はraywenderlichのfastlaneチュートリアルだと思います。
https://www.raywenderlich.com/136168/fastlane-tutorial-getting-started-2
注意:この回答は、バンドルIDとプロビジョニングプロファイルが手動で作成されることを前提としています。この方法を使用して自動化できるのはビルドプロセスのみです。
はい、サードパーティのツールを使用しなくても可能です。スクリプトファイルまたはメイクファイルの使用に慣れている必要があります。私は仕事中のMac Miniのメイクファイルで2行のコードを使用しています。そして、それは私たちの設定に従ってアップロードの準備ができているad-hoc
またはappstore
バージョンを提供します。
<?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にアドホック/配信プロビジョニングプロファイルがあることを確認してください。
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:不明な点がある場合はお知らせください。説明を追加します。
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が作成されます