1

この質問を (回答と共に) 投稿することで、iOS アプリの状態の変化をモジュールが自動的に検出 (および応答) するように進化させた巧妙な手法を他の人が利用できるようにします。(フォーマットされた)ブログディスカッションはこちらMy Blog

4

1 に答える 1

13

アプリの状態の変化に応じてコードを実行するための解決策をグーグルで検索すると、アプリケーションのdidFinishLaunchingWithOptions、didBecomeActive、またはWillEnterBackgroundのたびに呼び出されるため、コードの呼び出しをアプリのデリゲートに追加するコード例が見つかります。 。

ただし、コードの多くを再利用する別のアプリで作業を開始したとします。アプリのデリゲートメソッドを再配線することを心配せずに、いくつかのファイルをコピーしてすべての機能を取得できたら素晴らしいと思いませんか?

要約すると、プロジェクトに参加しているだけで、追加の作業や配線なしで作業を実行できるドロップインモジュールが必要です。この時点で、「ユニコーンやエルフにもピザを持ってきてもらいたい」と言っているかもしれません。我慢して。

ドキュメントを読んだときにこれをどのように見逃したのかはわかりませんが、iOSアプリケーションが状態を変更したときに、それを知っているのはアプリの代理人だけではありません。NSNotificationsは、すべての主要な状態変更についても通知されます。これは、APIリファレンスから直接取得したテキストです。

[applicationDidBecomeActive]を呼び出した後、アプリケーションはUIApplicationDidBecomeActiveNotification通知も送信して、関心のあるオブジェクトに遷移に応答する機会を与えます。

同様に、アプリケーションの起動が完了した直後に通知されるUIApplicationDidFinishLaunchingNotificationと、バックグラウンドまたはフォアグラウンドに入るその他の通知があります。

したがって、これによりコードが簡素化されます。

 [RobustWebService handleAppBecomingActive]

アプリデリゲートのapplicationDidBecomeActiveの実装では、RobustWebServiceがUIApplicationDidFinishLaunchingNotificationに応答する必要があります。

これについて少し考えてみると、RWSクラスが通知を処理するには、オブザーバーとして登録する必要があることに気付くかもしれません。その呼び出しは次のようになります

[[NSNotificationCenter defaultCenter] addObserver:self
Selector:@selector(handleAppBecomeActive)
name:UIApplicationDidFinishLaunchingNotification
object :nil]

そして、それはどこで行うことができますか?自己完結型のドロップインモジュールを使用する意図が失われるため、アプリデリゲートに触れたくないことを忘れないでください。そのクラスに対してaddObserver関数呼び出しを自動的に実行させる方法があった場合のみ。場合のみ…</p>

この時点で、「Cocoa」から脱退し、Objective-Cの基盤となるテクノロジーを掘り下げる必要があります。案の定、「load」と呼ばれるクラスメソッドがあります。これは、クラス定義に存在する場合、クラスが最初にロードされるときに自動的に呼び出されます。それをコードで言い換えましょう。この関数を任意のclass.mファイルに書き込む場合

    + (void) load
    {
                // stuff
    }

クラスがiOSによってロードされるときに実行されます。興味深いことに、これはアプリのmain()ルーチンが呼び出される前に実行されるため、何をしようとしているかに十分注意する必要があります。この時点では、ほとんどのアプリは実際には稼働していませんが、クラスがリンクしているすべてのフレームワークが最初に読み込まれることが保証されています。NSNotificationCenterなどのフレームワーク。これをclass.mに含めると

     + (void) load
     {
      [[NSNotificationCenter defaultCenter] addObserver:self
                Selector:@selector(handleAppBecomeActive)
                name:UIApplicationDidFinishLaunchingNotification
                object :nil];
     }

次に、アプリがアクティブになると、プロジェクトにclass.hとclass.mを含める以外に何もしなくても、handleAppBecomeActiveメソッドが呼び出されます。

そして、このコードをclass.mファイルに含めると

+ (void) load;
{
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(handleAppLaunched)
     name:UIApplicationDidFinishLaunchingNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self         selector:@selector(handleAppResigningActive) name:UIApplicationWillResignActiveNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppBecomingActive) name:UIApplicationDidBecomeActiveNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringForeground) name:UIApplicationWillEnterForegroundNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppClosing) name:UIApplicationWillTerminateNotification object:nil];
}

クラスには、他の作業を必要とせずに、すべてのアプリの状態の変更が通知されます。これはとてもかっこいいので、それでも私はピリピリと感じます。楽しみ!

テリー

于 2011-02-07T19:23:09.680 に答える