21

Is there an easy way to have per-configuration app group entitlement strings in Xcode projects?

We're trying to share settings between an iOS application and today extension using an "app group" entitlement in both the targets.

The problem we're having is that we build the application with different bundle and team ids depending on whether it's an enterprise or a release build.

When I use Xcode 6's Capabilities screen, the app groups show up in red lettering and I don't see a way to change the strings for each configuration individually.

I assume one of the following will work, but I don't know which I should try first:

  1. .xcconfig files
  2. Manually created entitlement files
  3. Build script
  4. Configuration-dependent plist entries

Suggestions?

4

3 に答える 3

0

この質問のコメントが示すように、Xcode 8 にはバグがあるようです。

私は非常に大雑把で危険ですが、有効な回避策を持っていると思います。

アイデアは、Xcode 8 が認識する資格ファイルを 1 つだけ持ち、スクリプトを使用して、構築しようとしている構成の正しいファイルに置き換えることです。

この回避策には多くの手順があり、すべての手順が必要なわけではありません。より多くの情報が得られたら、この投稿を更新しようとします。このようなことをあえてテストする場合は、コメントを追加してください。

さらに、Xcode 8 を再度開く前に、おそらく古いプロビジョニング プロファイルを削除する必要があります。

Xcode 8 を開く前に派生データを削除することも役立つようです。

警告!あなた自身の責任でこれをテストしてください。これは取り返しのつかない損害を与える可能性があります

  • すべてのプロビジョニング プロファイルを削除します
  • DerivedData を削除します

このハックのセットアップ

  • 以下のスクリプトをプロジェクト フォルダーに保存します。
  • MyProject* を読み取るプロジェクト名とターゲット名にパッチを適用します
  • 構成名にパッチを当てる
  • このスクリプトが MyProject.entitlements の上にコピーしようとする構成ごとの資格ファイル名を確認してください
  • MyProject.entitlements をすべての構成で資格ファイルとして構成する
  • すべてのターゲットに対して同じことを行います (たとえば、watchkit アプリがある場合)
  • スクリプトを実行する前に:
    • Xcode で正しいスキームを選択する
    • Xcode を閉じる

スクリプト テンプレート:

    #!/bin/bash                                                                                                                                                                                                                       

    echo

    if [ ! -n "$BASH" ] ;then echo Please run this script $0 with bash; exit 1; fi

    if [ $# -ne 1 ];  then
        echo
        echo "ERROR: one of the following expected as parameter: release alpha debug"
        echo
        exit -2
    fi

    chosen=$1

    echo "You have chosen build configuration $chosen"
    echo
    echo "This script is a workaround for Xcode 8 bug in handling different build configs and app groups."
    echo "(This scenario is most likely not on Apples list of things that developers are expected to do.)"
    echo
    echo "See comments in this SO answer"
    echo "http://stackoverflow.com/a/25734318/1148030"
    echo
    echo "1) This script must be run with Xcode 8 shut down."
    echo "2) All old provisioning profiles will be deteled. Xcode 8 will recreate them with hopefully correct build config."
    echo
    echo
    echo "WARNING: This will delete ALL provisioning profiles for all apps!"
    echo "WARNING: This will delete ALL MyProject named DerivedData."
    echo

    read -n 1 -s -p "Press any key to continue or Ctrl-C to cancel"

    echo

    # NOTE ABOUT DELETING DERIVED DATA                                                                                                                                                                                                
    # Deleting derived data fixes 2 bugs:                                                                                                                                                                                             
    # 1) Xcode 8 stubbornly generating some distribution profiles for old entitlements files                                                                                                                                          
    # 2) Install from HockeyApp fails due to signing verification error                                                                                                                                                               

    echo "Deleting derived datas"
    rm -vrf /Users/pelam/Library/Developer/Xcode/DerivedData/MyProject-*
    echo

    echo "Deleting provisioning profiles"
    rm -v ~/Library/MobileDevice/Provisioning\ Profiles/*.mobileprovision

    echo

    echo "Replacing target entitlements files"
    echo
    cp -v "./MyProjectTarget/MyProjectTarget.$chosen.entitlements" "./MyProjectTarget/MyProjectTarget.entitlements" || exit -1
    cp -v "./MyProjectAnotherTarget/MyProjectAnotherTarget.$chosen.entitlements" "./MyProjectAnotherTarget/MyProjectAnotherTarget.entitlements" || exit -1
    echo ADD COPY COMMANDS FOR OTHER TARGETS HERE

    echo
    echo "SUCCESS! Now run Xcode and verify that correct profiles are created."
    echo
    echo "NOTE:"
    echo "Running following command after starting Xcode 8 and waiting a bit can show you what appgroup is selected in each profile."
    echo "There should only the one correct app group or the release group. No duplicates in one file or mixed."
    echo "If you are not using multiple app groups, you can view the provisioning profile files in text editor to see that they contain correct settings for the configuration you are trying to build"
    echo "grep -a appgroup ~/Library/MobileDevice/Provisioning\ Profiles/*.mobileprovision"
    echo
    echo
于 2016-11-02T08:36:24.310 に答える