4

私はトリッキーな問題に直面しています。誰かが以前に似たような問題に遭遇したことを願っています。

OS X アプリ (アプリ バンドル、Yosemite 10.10.2 でテスト) を作成し、このバンドルの一部としていくつかのヘルパー サブ アプリを使用しました。これらのサブアプリは、独自のアプリ バンドルに格納されます。

構造は次のとおりです。

AppName.app
      -> Contents/Frameworks/SubAppName_1.app
      -> Contents/Frameworks/SubAppName_2.app

などなど。これはすべてうまく機能し、まったく問題ありません。

この問題は、開発/アドホック/Mac App Store 展開の準備のためにアプリをサンドボックス化/共同設計するときに発生し始めます。

次のコマンドを使用して、アプリバンドル (+ サブコンポーネント) に署名しています

codesign --verbose --force --sign "$IDENTITY" --entitlements entitlements.child "$OUTDIRECTORY/AppName.app/Contents/Frameworks/SubAppName_1.app" 
codesign --verbose --force --sign "$IDENTITY" --entitlements entitlements.child "$OUTDIRECTORY/AppName.app/Contents/Frameworks/SubAppName_2.app" 
codesign --verbose --force --sign "$IDENTITY" --entitlements entitlements.parent "$OUTDIRECTORY/AppName.app"

繰り返しますが、うまくいきます。署名済みアプリが起動し、正常に動作します。すべての機能が動作しており、バグ/クラッシュ/目に見えるエラーはありません。サンドボックス化されていない/共同設計されたアプリに似ています。すべてがサンドボックスで実行されます。何時間もアプリを使用できますが、問題ありません。

ただし、アプリをしばらく閉じると (たとえば、15 ~ 30 分、かなりランダムです)、サブアプリの1 つで署名が無効であるというエラーが表示されます (メイン バンドルはそれらをサブ プロセスとして生成します)。

12:38:56 MBA.local amfid[274]: /Applications/AppName.app/Contents/Frameworks/SubAppName_1.app/Contents/MacOS/SubAppName_1 signature not valid: 0xfffefa31
12:38:56 MBA kernel[0]: proc 82808: load code signature error 4 for file "SubAppName_1"
12:38:57 MBA.local amfid[274]: /Applications/AppName.app/Contents/Frameworks/SubAppName_1.app/Contents/MacOS/SubAppName_1 signature not valid: 0xfffefa31
12:38:57 MBA kernel[0]: proc 82811: load code signature error 4 for file "SubAppName_1"

数分後にアプリを再起動しても、すべてが機能します。10 回中 9 回は、アプリを再コンパイルして再び機能させる必要があります。ただし、時折、ランダムに再び機能し始めます。

このアプリの AdHoc ビルドを無関係の Yosemite デバイスに展開すると、同じことが起こりますが、次の amfid エラー コードが表示されます: 0xfffefa2a

これを引き起こしている可能性のあるアイデアはありますか?私が間違っていることがあるに違いありません!

4

1 に答える 1

1

同じ問題が発生し、Apple 開発者サポートにチケットをオープンしました。それでも、ネストされたバンドルに問題の原因となっている脆弱性が見つかりました。

OS X は、大文字と小文字を区別しないファイル システムを使用します。したがって、ネストされたフレームワークに「SubAppName_1.app」または「subappname_1.app」という名前を付けることは基本的に問題ではありません。ヨセミテまではそうでした。OS X 10.10 では、Apple は iOS 由来の amfid (Apple Mobile File Integrity Daemon) の使用を開始しました。amfidでは、ファイル名とフォルダー名の大文字と小文字の区別が考慮されているようです。

最後に、ファイル名、フォルダー名、ソフト リンク、フレームワークの実行可能ファイルにコンパイルされた名前など、すべての大文字と小文字の区別を調整しました。

このotoolコマンドは、コンパイルで使用されている名前を確認するのに役立ちます。

>otool -L <your main executable> //Gives list of libraries to load
>otool -D <nested bundle's executable> //Gives self-name of the library

すべての名前の大文字と小文字の区別を揃えるとすぐに、問題はなくなりました。

于 2015-08-20T08:34:42.240 に答える