CatalystでMacに移植するときにポッドを除外する


14

Catalystのおかげで、アプリをMacに移植できるようになりました。問題は、多くのポッドがAppKitをサポートしていないことです。最も一般的なものはCrashlytics / Firebaseです。

In [...]/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics(CLSInternalReport.o), building for Mac Catalyst, but linking in object file built for iOS Simulator, file '[...]/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics' for architecture x86_64

最近のトピックなので、macOSのビルドからポッドを削除する方法に関するドキュメント見つかりませんでしたが、iOSおよびiPadO Sの場合はそのままにしてください

コードで使用することが可能です:

#if !targetEnvironment(macCatalyst) 
// Code to exclude for your macOS app
#endif

しかし、問題のその一部、他の部分は、iOS専用のポッドをリンクすることです...

ライブラリがmacOSに不可欠ではないが、iOSで引き続き必要な場合、最も簡単/最善の行動方針は何でしょうか?

回答:


12

@ajgrycの回答に従って、洗練されたソリューションを作成できました。

podfileに追加

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == "Pods-[Name of Project]"
            puts "Updating #{target.name} OTHER_LDFLAGS to OTHER_LDFLAGS[sdk=iphone*]"
            target.build_configurations.each do |config|
                xcconfig_path = config.base_configuration_reference.real_path
                xcconfig = File.read(xcconfig_path)
                new_xcconfig = xcconfig.sub('OTHER_LDFLAGS =', 'OTHER_LDFLAGS[sdk=iphone*] =')
                File.open(xcconfig_path, "w") { |file| file << new_xcconfig }
            end
        end
    end
end

Cocoapods 1.8.4以降

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == "Pods-[Name of Project]"
      puts "Updating #{target.name} to exclude Crashlytics/Fabric"
      target.build_configurations.each do |config|
        xcconfig_path = config.base_configuration_reference.real_path
        xcconfig = File.read(xcconfig_path)
        xcconfig.sub!('-framework "Crashlytics"', '')
        xcconfig.sub!('-framework "Fabric"', '')
        new_xcconfig = xcconfig + 'OTHER_LDFLAGS[sdk=iphone*] = -framework "Crashlytics" -framework "Fabric"'
        File.open(xcconfig_path, "w") { |file| file << new_xcconfig }
      end
    end
  end
end

次に、Fabricの実行スクリプトビルドフェーズで:

if [[$ARCHS != "x86_64"]]; then
  "${PODS_ROOT}/Fabric/run" [your usual key]
fi

3
これは、すべてのCocoaPodsがMacCatalystにリンクされないようにするのに役立ちます。3行目をに変更して、if target.name.start_with?("Pods")すべてのポッドターゲットをキャッチします。
ウィリアムデニス

これはココアポッド1.8.4で動作しないようです
tmm1

1
「target.name.start_with?( "Pods")」がcocoapods 1.8.4でも機能しない場合、両方の方法を試しましたが、以下のエラーが発生しました。だれでもガイドできます。/Users/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRConnectorUtils_d79571aba36a7d46e5c6ca87a6fec1c1.o)で、Mac Catalyst用にビルドしますが、iOSファイル用にビルドされたオブジェクトファイル '/ Desktops / iOSシミュレータ用のオブジェクトファイルをリンクします/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'for architecture x86_64
Patel

1
実行スクリプトのために、あなたも使用することができます:if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
Honghao張

回答を更新してココアポッドに問題へのリンクを含め、回答を読んでいる人が回答に賛成できるようにできますか?私の意見では、これはそのまま使用できるはずです。github.com/CocoaPods/CocoaPods/issues/9364
KleMiX

8

プロジェクトのPodsディレクトリにあるPods- $ projectname.release.xcconfigファイルを開き、OTHER_LDFLAGS行を見つけます。[sdk=iphone*]変数名の直後に追加します(例として、次のようになります):

OTHER_LDFLAGS[sdk=iphone*] = $(inherited) -ObjC -l"MailCore-ios" -l"c++" -l"iconv" -l"resolv" -l"xml2" -l"z"

これにより、iphoneバリアントをビルドするときにのみリンクオプションが条件付きで設定され、OSXでポッドがリンクされなくなります。もちろん、おっしゃるように、これはポッドを呼び出すコード#if !targetEnvironment(macCatalyst)と組み合わせて#endif囲む必要があります。そうしないと、リンカーエラーが発生します。

これにより、同じ問題を回避できました。(そして、あなたがあなたの.xcconfigファイルに追加できる条件付き変数以外に他にどんな素晴らしいものがあるのか​​疑問に思っているなら、ここに私が見つけた参照があります:https ://pewpewthespells.com/blog/xcconfig_guide.html )


1
私はあなたに賞金を差し上げましたが、人々の生活を楽にする解決策を箱から出したので、私自身の答えを受け入れました。どうもありがとうございました!
AncAinu

申し訳ありませんが、Pods- $ projectname.release.xcconfigファイルがあります。それを見つけることができません。
Ankur Patel

私の構成では、<Project Directory> / Pods / Target Support Files / Pods- <Project Name>
ajgryc

xcconfigは常にすべてのでビルドされるため、このソリューションは推奨されませんpod install。最良の代替案については、このフェルナンドモヤデリバスの回答を読むことをお勧めします
Oz Shabat

6

cocoapods 1.8.4では、@ AncAinuの優れた答えを次のように適応させる必要がありました。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == "Pods-[Name of Project]"
      puts "Updating #{target.name} to exclude Crashlytics/Fabric"
      target.build_configurations.each do |config|
        xcconfig_path = config.base_configuration_reference.real_path
        xcconfig = File.read(xcconfig_path)
        xcconfig.sub!('-framework "Crashlytics"', '')
        xcconfig.sub!('-framework "Fabric"', '')
        new_xcconfig = xcconfig + 'OTHER_LDFLAGS[sdk=iphone*] = -framework "Crashlytics" -framework "Fabric"'
        File.open(xcconfig_path, "w") { |file| file << new_xcconfig }
      end
    end
  end
end

ちなみに、Crashlyticsの最新リリースはオープンソースになり、必要に応じてCatalyst向けに直接コンパイルできます。Crashlyticsの場合、このハックは不要になりましたが、他のレガシーポッドで役立つ場合があります。
tmm1

上記のプロジェクト名の部分に、プロジェクトファイルの名前を記述する必要がありますか?if target.name == "Pods- [MyProjectExample]"。そのようなものか、単に答えを貼り付けますか?なぜなら、私にとってそれdoest仕事
Bartu Akman

はい、プロジェクト名に置き換える必要があります。
tmm1

私はすべてを正しく行いました。if target.name == "Pods- [VPNoid]"クリーンアップして、プロジェクトを再度ビルドします。それでもエラーは不満です。何か考えはありますか?
Bartu Akman

1
[]
tmm1を

3

次のGoogleポッドで動作する更新されたソリューションがあります。

  pod 'FirebaseUI/Auth'
  pod 'FirebaseUI/Phone'
  pod 'FirebaseUI/Email'
  pod 'Firebase/Auth'
  pod 'Firebase/Analytics'
  pod 'Fabric', '~> 1.10.2'
  pod 'Firebase/Crashlytics'
  pod 'Firebase/AdMob'
post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name.start_with?("Pods")
        puts "Updating #{target.name} to exclude Crashlytics/Fabric"
      target.build_configurations.each do |config|
        xcconfig_path = config.base_configuration_reference.real_path
        xcconfig = File.read(xcconfig_path)
        xcconfig.sub!('-framework "FirebaseAnalytics"', '')
        xcconfig.sub!('-framework "FIRAnalyticsConnector"', '')
        xcconfig.sub!('-framework "GoogleMobileAds"', '')
        xcconfig.sub!('-framework "Google-Mobile-Ads-SDK"', '')
        xcconfig.sub!('-framework "GoogleAppMeasurement"', '')
        xcconfig.sub!('-framework "Fabric"', '')
        new_xcconfig = xcconfig + 'OTHER_LDFLAGS[sdk=iphone*] = $(inherited) -framework "FirebaseAnalytics"  -framework "FIRAnalyticsConnector"  -framework "GoogleMobileAds" -framework "GoogleAppMeasurement" -framework "GoogleUtilities" "-AppMeasurement" -framework "Fabric"'
        File.open(xcconfig_path, "w") { |file| file << new_xcconfig }
      end
    end
  end
end

私はこのソリューションを最もきれいに見えるので使用しようとしていますが、次のエラーが発生します:ld: in /Users/<name>/source/<app>/Pods/Fabric/iOS/Fabric.framework/Fabric(Fabric.o), building for Mac Catalyst, but linking in object file built for iOS Simulator, for architecture x86_64上記のマイナスGoogleMobileAdsとマイナスを正確に使用しますGoogle-Mobile-Ads-SDK。なぜこれを取得するのですか?
fphelp

よく分かりません。この時点で、ファブリックを削除するときがきましたね。グーグルがそれらを購入する権利を持っていることに私は同意しません、しかし彼らはそうしたのでそれをシャットダウンしました...
Andy

悲しいことに「pod Crashlytics」を使用すると、Fabric(1.10.2)が自動的にインストールされます。なぜそれが起こるのかわからず、「Firebase / Crashlytics」ポッドの使用には注意が必要です。Googleはまだそれがベータ段階であると言っているからです:(
fphelp

3

Catalystでサポートされていないフレームワークを処理する最善の方法については、フェルナンドモヤデリのソリューションをお読みください。

彼は基本的に、次のように、Mac osxにインストールしたくないすべてのライブラリの配列を定義する必要があるだけだと言っています['Fabric', 'Crashlytics', 'Firebase/Core', ...]

そうすると、ポッドファイルは次のように単純になります。

# Podfile
load 'remove_unsupported_libraries.rb'
target 'My target' do
   use_frameworks!
   # Install your pods
   pod ...
end

# define unsupported pods
def unsupported_pods
   ['Fabric', 'Crashlytics', 'Firebase/Core', ...]
end

# install all pods except unsupported ones
post_install do |installer|
   configure_support_catalyst installer, unsupported_pods
end

2
ありがとう!これは非常に完全なソリューションになるはずです!
WildCat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.