web-dev-qa-db-ja.com

「警告:dylibに対するリンクはアプリケーション拡張機能での使用には安全ではありません」を抑制する方法は?

IOSアプリケーションと拡張機能の間で共有される動的なフレームワークがあります。そのフレームワークにはUIApplicationを参照するコードがあります。これはもちろん拡張機能では使用できません。これらの呼び出しは完全に分離されているので、拡張機能で問題が発生する心配はありません。

警告メッセージにフラグが指定されていないので、おそらくそれを行う方法はありませんが、どうすればsuppresswarning: linking against dylib not safe for use in application extensionsプロジェクトをビルドするとき?

38
Wayne Hartman

Watch/to-widget拡張ターゲット(アプリやlibrayターゲットではない)の場合、プロジェクト設定に移動し、ビルド設定「APPLICATION_EXTENSION_API_ONLY」/「App-Extension-Safe APIのみが必要」をNOに変更します。

29
Oliver Pearmain

組み込みフレームワークを使用して、アプリの拡張機能とそれを含むアプリの間でコードを共有できると思います。ただし、フレームワークに拡張機能で利用できないAPIが含まれていないことに注意する必要があります。 一部のAPIはApp Extensionsで使用できない および 埋め込みフレームワークを使用してコードを共有する を参照してください。

フレームワークにそのようなAPIが含まれていない場合は、Require Only App-Extension-Safe API to[〜#〜] yes [〜#〜]フレームワークターゲットのBuild Settings

enter image description here

アプリケーションと拡張機能の間でソースファイルを共有する2番目の方法として、別のフレームワークターゲットを作成する必要はありません。両方の2つのプロジェクトをターゲットにすることで、ソースファイルを共有できます。

enter image description here

9
abdullahselek

簡単な答え:本当にする方法はありません。

最終的には、コードをリファクタリングして、拡張機能と動的フレームに共通する部分を引き出して、拡張機能が電話固有のコードとは無関係にそれらの部分を安全に参照できるようにしました。

将来的にはApp Storeに提出する必要があり、AppleのガイドラインはUIApplicationを参照することは非常に重要であるため、私はこれをやめました。

7
Wayne Hartman

時々「ナニー」はよく知らない。

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拡張機能からこれを呼び出そうとするとクラッシュします。

1
Confused Vorlon

Quick(およびNimble)がアップデートでこの問題を修正したため、プロジェクト設定でこれを設定しないでください: https://github.com/Quick/Quick/releases/tag/v1.3.1 (および https://github.com/Quick/Nimble/releases/tag/v7.1. )!

両方の依存関係を最新バージョンに更新するだけで、警告が消えます。

0
blackjacx