IOSアプリケーションと拡張機能の間で共有される動的なフレームワークがあります。そのフレームワークにはUIApplication
を参照するコードがあります。これはもちろん拡張機能では使用できません。これらの呼び出しは完全に分離されているので、拡張機能で問題が発生する心配はありません。
警告メッセージにフラグが指定されていないので、おそらくそれを行う方法はありませんが、どうすればsuppresswarning: linking against dylib not safe for use in application extensions
プロジェクトをビルドするとき?
Watch/to-widget拡張ターゲット(アプリやlibrayターゲットではない)の場合、プロジェクト設定に移動し、ビルド設定「APPLICATION_EXTENSION_API_ONLY」/「App-Extension-Safe APIのみが必要」をNOに変更します。
組み込みフレームワークを使用して、アプリの拡張機能とそれを含むアプリの間でコードを共有できると思います。ただし、フレームワークに拡張機能で利用できないAPIが含まれていないことに注意する必要があります。 一部のAPIはApp Extensionsで使用できない および 埋め込みフレームワークを使用してコードを共有する を参照してください。
フレームワークにそのようなAPIが含まれていない場合は、Require Only App-Extension-Safe API
to[〜#〜] yes [〜#〜]フレームワークターゲットのBuild Settings
。
アプリケーションと拡張機能の間でソースファイルを共有する2番目の方法として、別のフレームワークターゲットを作成する必要はありません。両方の2つのプロジェクトをターゲットにすることで、ソースファイルを共有できます。
簡単な答え:本当にする方法はありません。
最終的には、コードをリファクタリングして、拡張機能と動的フレームに共通する部分を引き出して、拡張機能が電話固有のコードとは無関係にそれらの部分を安全に参照できるようにしました。
将来的にはApp Storeに提出する必要があり、AppleのガイドラインはUIApplication
を参照することは非常に重要であるため、私はこれをやめました。
時々「ナニー」はよく知らない。
UIApplication.shared
へのリンクを避け、フレームワーク内で動的にメソッドを呼び出すだけです。
class Application {
static var shared: UIApplication {
let sharedSelector = NSSelectorFromString("sharedApplication")
guard UIApplication.responds(to: sharedSelector) else {
fatalError("[Extensions cannot access Application]")
}
let shared = UIApplication.perform(sharedSelector)
return shared?.takeUnretainedValue() as! UIApplication
}
}
これにより、リンカーをフリークせずに、UIApplication.shared
を効果的に呼び出すことができます(単にApplication.Shared
を呼び出します)。
will拡張機能からこれを呼び出そうとするとクラッシュします。
Quick(およびNimble)がアップデートでこの問題を修正したため、プロジェクト設定でこれを設定しないでください: https://github.com/Quick/Quick/releases/tag/v1.3.1 (および https://github.com/Quick/Nimble/releases/tag/v7.1. )!
両方の依存関係を最新バージョンに更新するだけで、警告が消えます。