web-dev-qa-db-ja.com

libswiftRemoteMirror.dylibとは何ですか。なぜアプリバンドルに含まれているのですか?

最近Xcode 8に切り替えたiOSアプリがあります。その一部として、Swift 2.2から2.3に切り替えました(Swift 3は後ほど提供します)。

本質的にxcodebuildを実行して専用のビルドマシンでリリースバイナリを生成する自動ビルドパイプラインがあり、それをすべて整理した後(Xcode 8の自動コード署名は本当にすべてを台無しにします)、今私はiTunes Connectにアプリをアップロードすると、次のエラーで失敗します。

エラーITMS-90171:「無効なバンドル構造-バイナリファイル「MyApp.app/libswiftRemoteMirror.dylib」は許可されていません。アプリには、サポートされているバンドルのCFBundleExecutable以外のスタンドアロンの実行可能ファイルまたはライブラリを含めることはできません。 iOSアプリのバンドル構造については、 https://developer.Apple.com/go/?id=bundle-structure のガイドをご覧ください。」

案の定、.ipaファイルを解凍して見てみると、libswiftRemoteMirror.dylibそこに座っています。

Xcodeを介してiTunes用にアーカイブ/エクスポートすると、libswiftRemoteMirror.dylib、ただし、私のアプリの他のすべてのビルドには含まれているようです。 Xcode内でデバッグビルドを行ってから出力を見ると、libswiftRemoteMirror.dylibがアプリのバンドルに含まれていることがわかります。これは、Xcode自体が自動ビルドスクリプトの一部ではなく間違いなくそこに置いていることを示しています。

このファイルは何ですか、なぜそこに置かれているのですか、それについてどうすればよいですか?リリースビルド用にこのファイルを削除するようにビルドスクリプトを変更できますが、コード署名プロセスに影響する可能性があります。とにかく試してみて、何が起こるか見てみますが、それは正しいことではないように感じます。

アドバイスをいただければ幸いです。

28
Orion Edwards

コマンドラインのxcodebuildを自動コード署名で動作させることはできませんでした。自動ビルドマシンは、SSHを介してのみアクセスされる別のアカウントとして実行されるため、そのユーザーアカウントとして「完全な」Xcodeが実行されることはなく、ログインキーチェーンなどに証明書が存在しないためだと思います。

shenzhenのようなものは使いたくありませんでした。なぜなら、私は過去にそのようなことから悪い経験しかなかったからです。 Xcodeビルドシステムは複雑で壊れやすいので、スクリプトを追加したり、間違ったり古くなったりする可能性のあるものを追加する必要はありません。

問題を解決するために私がやったことは次のとおりです(それは恐ろしいことですが、最終的に機能するようになったのは私が見つけることができる唯一のものでした)

  1. 自動ビルドスクリプトで_.pbxproj_を編集して、_Provisioning Style = Automatic;_を検索し、_Provisioning Style = Manual;_に置き換えます。また、同じpbxprojファイル内のコード署名用の_iOS Developer_を_iOS Distribution_に置き換えます。これら2つのことは自動署名をオフにします

  2. xcodebuildを実行して、Xcode7で行ったのと同じ方法でプロジェクトをビルドします(アーカイブはしません)。 Xcodeはアプリをコンパイルして署名しますが、_libswiftRemoteMirror.dylib_が含まれており、何らかの理由で資格ファイルがないため、まだ有効ではありません

  3. アプリバンドルから_libswiftRemoteMirror.dylib_を削除します(これにより署名が無効になります)

  4. プロビジョニングプロファイルからエンタイトルメントビットを抽出して、アプリバンドルフォルダーに_Entitlements.plist_を生成します( BlackBerryのSWSiOSResign.sh スクリプトのように)

    1. _codesign --entitlements <file>_を使用してアプリバンドルに再署名します

    2. そこから、 _bq/package_ipa.sh_ と同様の手法を使用してSwiftSupportフォルダーをコピーし、ファイルをipaにZipします。

私は実際には_package_ipa.sh_ファイルを使用できませんでした。アプリがまだSwift 2.3であるため、SwiftSupportを取得するには_Swift_2.3.toolchain_を参照する必要があるため、代わりに同様のロジックを再実装する必要がありました-_XcodeDefault.toolchain_ではありません(Swift 3です)

これらの手順の一部を回避するために、_xcodebuild --archive_を他のいくつかと組み合わせて使用​​できるはずです。 Xcode7でそれを機能させることはできませんでしたが、時間があればXC8でもう一度試すかもしれません

3
Orion Edwards

私の場合、カスタムフレームワークを使用しているため、エラーITMS-90171が発生しました。

「無効なバンドル構造-バイナリファイル「MyFramework.framework/libswiftRemoteMirror.dylib」

(自分のアプリケーションでそれを取得できませんでした。)

私はジムを試しました しかし、xcrunで立ち往生しました 。だから私はrm -rf libswiftRemoteMirror私が持っているすべてのカスタムフレームワークのビルドフレーズ(カスタムの実行スクリプトを使用)で、興味深いことに、何も壊していませんでした。

4
Archy Will He

最近、プロジェクトでSwift=を使用し始め、同じエラーが発生しました。

根本的な原因を見つけるために、「grep -Ril "libswiftRemoteMirror"」を実行しました。 XCode.app(現在10.1があります)で../Contents/PlugIns/Xcode3Core.ideplugin/Contents/SharedSupport/Developer/Library/Xcode/Plug-ins/XCLanguageSupport.xcplugin/Contents/Resources/Swift-stdlib-toolが見つかりました。 xcspecファイル。それは言います:

     // Swift_RESOURCE_DESTINATION and Swift_RESOURCE_LIBRARY allow us to copy
    // libswiftRemoteMirror.dylib into place so that memory debugging tools have access to it
    // on device.
    // We disable these options in "DEPLOYMENT" modes, so that the libswiftRemoteMirror.dylib
    // does not make its way into archives submitted to the App Store.


そのため、ソリューションは簡単です-XCodeターゲット設定で、リリース構成(またはビルドに使用するもの)に対してDeployment PostprocessingをYesに設定します

3
Art

Xcode 8をインストールした後、 shenzhen でビルドすることで同じ問題に遭遇しました。

私は Fastlane を代替手段として見ることにし、それらの gym プログラムはAppleに提出できるipaを生成します。

ipa(深センの実行可能ファイル)への呼び出しをgymへの呼び出しに置き換えるのはかなり簡単で、残りのビルドおよびアップロードスクリプトは修正なしで機能しました。

直接ビルドしたい場合は、gym readmeから以下を取り上げました。 .xcarchiveなしの.appファイルを含むlibswiftRemoteMirror.dylibを生成します。私はそのようなフローを自分で使用しないので、そこからどのように進むか言うことはできません。

xcodebuild \
  -scheme Scheme \
  -workspace Project.xcworkspace \
  -configuration 'Release' \
  -destination 'generic/platform=iOS' \
  -archivePath './Output.xcarchive' \
  archive
3
Fizker

ビルド設定に移動して、問題が解決するのを待ってください。

enter image description here

2
Noushad Shah

xcodeからビルドをアーカイブするには、アーカイブファイルを右クリック-> Finderで表示->右クリック->パッケージコンテンツを表示->製品-> appliction-> .appファイルをコピーし、Application Loaderを使用してペイロードを生成してアップロードします。それは私の場合に役立ちます。

0
Kalpesh Muthe