web-dev-qa-db-ja.com

複数のターゲットを持つiOS拡張機能

IOS 8では、新しい拡張機能を作成するときに、それがアタッチされるターゲットを決定する必要があります。拡張機能は、ターゲットと同じバンドルIDのプレフィックスを持ちます。

  1. 後でターゲットを変更する方法はありますか?
  2. プロジェクトに2つ(またはそれ以上)のターゲットが含まれている場合(たとえば、1つはデバッグ/シミュレーター、もう1つは本番/デバイス用)、拡張機能を使用するための最良の方法は何ですか?別の拡張機能を作成してコードを複製する必要がありますか(両方のターゲットで同じコードを維持するのは非常に面倒です)?
37
Enzo Tran

多数のターゲット間で1つのウィジェットを共有するには、General構成タブのすべての親ターゲットのwidget.appexターゲットをEmbedded Binariesに追加するだけです

enter image description here

次に、Embed App ExtensionsBuild Phasesエリアを自動的に取得します

enter image description here

28
malex

これは私のセットアップです。3つのターゲット(本番、ステージング、ローカル)と、3回複製したくない拡張ターゲットがあります。

Neo Chen の答えを明確にするために、親ターゲットのスキームをそれぞれ編集します。

ビルド>プレアクション>新しいスクリプト実行アクション>(親スキーム)からビルド設定を提供します。

これを拡張子ごとに貼り付けます。

#!/bin/bash

buildID=${PRODUCT_BUNDLE_IDENTIFIER}
extId="notification-service"

/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $buildID.$extId" "${SRCROOT}/${extId}/Info.plist"

最初のビルドに取り組むようです。

14
apparition47

独自のInfo.plistを使用して、Extensionターゲットを複製するだけで、それ以外は複製できないようです。

ただし、拡張機能を作成すると、以下に示すように、Xcodeが「Embed App Extensions」をアプリのターゲットのビルドフェーズに追加します。これを行うためのUIはまだありません。

enter image description here

それでも、2番目のターゲットの拡張子を作成し、.plistを除くすべてのファイルを削除して、修正する必要があるものを修正できます。手順は次のとおりです。

  • 「ターゲット1」の「拡張1」を作成します
  • 「ターゲット2」の「拡張2」を作成します
  • Info.plistを除き、「Extension 2」用に作成されたすべてのファイルを削除します
  • 「拡張2」の「ビルドフェーズ」ターゲットを「拡張1」のビルドフェーズと同じにします。通常、これは必要な.mファイルを「ソースのコンパイル」フェーズに追加し、リソースを「バンドルリソースのコピー」フェーズに追加します
10
leonaka

この要件をサポートする実行スクリプトを作成しました

#!/bin/sh
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${SRCROOT}/ImagePush/Info.plist"

buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildVersion" "${SRCROOT}/ImagePush/Info.plist"

buildID=${PRODUCT_BUNDLE_IDENTIFIER}
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $buildID.ImagePush" "${SRCROOT}/ImagePush/Info.plist"

ImagePushは私の拡張機能です

ターゲットに必要なものを追加し、ビルドフェーズの拡張設定の前にこのスクリプトが実行されることを確認してください。その後、ビルドアクションを2回実行する必要があります(PS:最初に失敗したとき、改善しようとします)。複数のターゲットをサポート

6
Neo Chen

IDごとに複数の拡張機能を作成する必要がありますが、動的フレームワークを作成して、それを各拡張機能にリンクするだけです。その後、コードを複製する必要はありません。

1
Augard