1

Xcode で同じアプリの 2 つのバージョンをビルドしたいと思います。1 つは Sparkle フレームワークを使用し、もう 1 つは使用しません。別のターゲットを維持したくありません。代わりに、2 つの個別のビルド構成に依存する 2 つの個別のスキームを使用したいと考えています (1 つをデバッグ ビルド用に、もう 1 つをリリース ビルド用に使用するため、合計 4 つです)。

問題は、「ビルド フェーズ」の「バンドル リソースのコピー」と「バイナリのリンク」の手順が、特定のターゲットのすべてのスキームで同じであることです。

したがって、私の唯一のオプションは、ビルド後 (および署名前) に次のようなスクリプトを実行することです。

  1. アプリ バンドルからフレームワークを削除します。
  2. 実行可能ファイルからフレームワークをリンク解除します ( にリストされていますottol -L)。

助言がありますか?

4

1 に答える 1

3

かなりの作業の後、私は解決策を思いつきました。

  1. まず、フレームワークのリンクが「弱い」ことを確認します。これは、Xcode が「バイナリのリンク」フェーズで「オプション」と呼ぶものです。また、コード内で Sparkle を使用する場合は、欠落している Sparkle フレームワークが処理されることを確認してください。

フレームワークのオプションのリンク

  1. 「構成」タブの「情報」の下にあるプロジェクト設定に移動して、「Debug-no_sparkle」および「Release-no_sparkle」などと呼ばれる、デバッグ用とリリース用の個別のビルド構成を作成します。また、「スキーム」ポップアップ メニューに移動して、通常のスキームを複製し、スキームのさまざまなアクションで「no_sparkle」構成を使用して、対応するスキームを作成します。

  2. ターゲット設定のビルド フェーズに「スクリプトの実行」ステップを追加します。

スクリプト フェーズを実行して Sparkle フレームワークを削除する

私が使用するRubyスクリプトは次のとおりです。

config = ENV['CONFIGURATION']
if (config =~ /no_sparkle/)

    $stderr.puts "Removing Sparkle Framework"
    sparkle_path = "#{ENV['BUILT_PRODUCTS_DIR']}/#{ENV['FRAMEWORKS_FOLDER_PATH']}/Sparkle.framework"
    `rm -Rf "#{sparkle_path}"`

    $stderr.puts "Removing Sparkle Framework linking"
    binary_path = "#{ENV['BUILT_PRODUCTS_DIR']}/#{ENV['EXECUTABLE_PATH']}"
    `install_name_tool -change @rpath/Sparkle.framework/Versions/A/Sparkle @rpath/ "#{binary_path}"`
end

私ができなかったことの 1 つは、フレームワーク リンクに対応する行を完全に削除することでしたinstall_name_tool。痕跡を削除するために「/」に変更することしかできなかったので、フレームワークに何らかの形でアクセスできる場合でも、誤ってロードされることはありませんでした。完全に除去できると良いですね。

于 2016-09-30T10:02:02.210 に答える