The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

dynamic frameworkを使ってるプロジェクトでコマンドラインでipaファイル作成

Swiftでサブプロジェクトのモジュールをdynamic frameworkで取り込む場合にコマンドラインipaファイルを作成する手順です。

環境:Xcode7.1

従来のやりかたではできなかったのでメモしておきます

発生した問題

以前Objective-Cでstatic libraryでやっていたときは以下のようなやり方で作成できていました

$ xcodebuild -sdk iphoneos -target XXX -configuration Release clean build PROVISIONING_PROFILE=xxxxx-xxxx-xxxxxx-xxxxx
$ xcrun -sdk iphoneos XXX build/Release-iphoneos/***.app -o build/***.ipa --embed ****.mobileprovision

が、xcodebuildを実行したところ以下のように、dynamic frameworkをビルドする際にcode sign errorが発生してしまいビルドがこけてしまいます。

$ xcodebuild -sdk iphoneos -target XXX -configuration Release clean build PROVISIONING_PROFILE=xxxxx-xxxx-xxxxxx-xxxxx
Build settings from command line:
PROVISIONING_PROFILE = xxxxx-xxxx-xxxxxx-xxxxx
SDKROOT = iphoneos9.1

=== CLEAN TARGET YyyYYYYY OF PROJECT YyyYYYYY WITH CONFIGURATION Release ===

Check dependencies
[BEROR]Code Sign error: Provisioning profile does not match bundle identifier: The provisioning profile specified in your build settings (“xxxxxx”) has an AppID of “jp.xxxx.xxxxx” which does not match your bundle identifier “com.example.Yyyy”.

解決方法

xcocebuild build でprovisioning profileを指定するとdynamic frameworkもそのprovisioning profileを使ってビルドしようとしてcode sign errorが発生してしまうので、xcodebuild archiveをつかって一旦xcarchiveを生成して、ipaにexportする際にprovisioning profileを指定してやることによって解決しました。

$ xcodebuild -scheme XXXX archive -archivePath release/xxx.xcarchive

$ xcodebuild -exportArchive -archivePath release/xxx.xcarchive -exportOptionsPlist yyy.plist -exportPath zzz.ipa

exportOptionsPlistは以下のような感じになります。

<?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>MYTEAMID123</string>
        <key>method</key>
        <string>app-store</string>
        <key>uploadSymbols</key>
        <false/>
</dict>
</plist>

methodの値を変更することで、app store向けやadhocなどビルド方法を切り替えられます。

* app-store
* ad-hoc
* package
* enterprise
* development
* developer-id

その他のexportOptionsPlist内で設定できる内容は↓で確認できます

$ xcodebuild -h