4

現在、AppDelegate の application:didReceiveRemoteNotification: をスウィズルする必要がある製品に取り組んでいます (appDelegate 自体で新しいメソッドを呼び出したくありません)。

問題は、スウィズリングが機能しないということです。以前に何度かメソッドを入れ替えて成功しましたが、今回は、置き換えの実装が単に呼び出されていません。これらはアプリケーションではなくシステムによって呼び出されるため、appDelegateのメソッドの特定性が原因であるかどうか疑問に思っていました。

4

1 に答える 1

4

私はあなたの質問に欠けているもののほとんどを想定しようとしています。可能な限り常にコードサンプルで質問を投稿することをお勧めします。

  1. UIApplicationDelegate 自体ではなく、UIApplicationDelegate の特定の実装でメソッドをスウィズルしていることを確認する必要があります。例えば

    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    @end
    

    この場合、AppDelegate クラスをスウィズルする必要があります。

  2. また、静的ライブラリ/フレームワークを作成しようとしている場合、このクラスの名前がまったくわからない場合があります。このような場合、最も簡単で安全な方法は、アプリの AppDelegate 名を要求し、それを使用して NSClassFromString() を介して特定のクラス インスタンスを取得することです。

        unsigned int numberOfClasses = 0;
        Class *classes = objc_copyClassList(&numberOfClasses);
        Class appDelegateClass = nil;
        for (unsigned int i = 0; i < numberOfClasses; ++i) {
            if (class_conformsToProtocol(classes[i], @protocol(UIApplicationDelegate))) {
                appDelegateClass = classes[i];
            }
    }
    

編集

上記のアプローチにはいくつかの欠点があります。

  1. アプリケーション コードからアクセスできるすべてのクラスを反復処理します。これらのクラスすべてをループすることは、パフォーマンスの高いソリューションではありません。

  2. 多くの有名な SDK は、あなたAppDelegateの . これは、アプリケーションが複数のUIApplicationDelegateプロトコルの実装を持っている可能性があり、上記のコードがその実装を選択するだけで、重大な問題が発生する可能性があることも意味します。

Chris が以下のコメントで提案したように、単に使用する方がはるかに安全でパフォーマンスが高い[[UIApplication sharedApplication].delegate class]です。これにより、このコード行を呼び出した時点で iOS アプリケーションに認識されている正確な AppDelegate 実装が得られます。

于 2015-11-03T07:25:24.813 に答える