1

iOSアプリが高速アプリ切り替えからフォアグラウンドに入ったのか手動でフォアグラウンドに入ったのかを判断する方法はありますか?applicationWillEnterForegroundが呼び出されるまでに知る必要があるため、アプリがフォアグラウンドに入った条件に応じて、特定のコードを実行(または実行しない)できます。

編集:これは私にとってより設計上の問題であることが判明しました。コードをapplicationDidBecomeActiveに移動しました。また、fastAppSwitchingという名前のappDelegateにBOOLプロパティを追加しました(おそらく名前が間違っています)。application:handleOpenURLとapplication:openURL:sourceApplication:annotationでこれをYESに設定しました。次に、次のコードをアプリケーションに追加しました:didFinishLaunchingWithOptions:

        if (launchOptions) {
            self.fastAppSwitching = YES;
        }
        else {
            self.fastAppSwitching = NO;
        }

applicationDidBecomeActiveでは、次のコードを使用しました。

    if (fastAppSwitching == YES) {
        self.fastAppSwitching = NO; //stop, don't go any further
    }
    else {
       ...
    }

EDIT2:MaxGabrielは、以下の良い点を指摘しています。「ここで説明する解決策を採用している他の人への警告です。applicationDidBecomeActive:は、applicationWillEnterForegroundとは異なり、ユーザーが電話やテキストメッセージを無視した場合に呼び出されます」。これは実際には、アプリ内購入とFacebookアプリ内認証(iOS 6の新機能)にも当てはまります。したがって、さらにいくつかのテストを行うと、これが現在の解決策になります。

passThroughWillEnterForegroundという新しいブール値を追加します。

applicationWillResignActiveの場合:

self.passedThroughWillEnterForeground = NO;

applicationDidEnterBackgroundの場合:

self.passedThroughWillEnterForeground = NO;

applicationWillEnterForegroundの場合:

self.passedThroughWillEnterForeground = YES;

applicationDidBecomeActiveの場合:

    if (passedThroughWillEnterForeground) {
        //we are NOT returning from 6.0 (in-app) authorization dialog or in-app purchase dialog, etc
        //do nothing with this BOOL - just reset it
        self.passedThroughWillEnterForeground = NO;
    }
    else {
        //we ARE returning from 6.0 (in-app) authorization dialog or in-app purchase dialog - IE
        //This is the same as fast-app switching in our book, so let's keep it simple and use this to set that
        self.fastAppSwitching = YES;
    }

    if (fastAppSwitching == YES) {

        self.fastAppSwitching = NO;
    }
    else {
        ...
    }

EDIT3:アプリが終了から起動されたかどうかを判断するためのブール値も必要だと思います。

4

2 に答える 2

3

アプリケーションが別のアプリケーションによって起動された場合、

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
  sourceApplicarion:(NSString *)bundleID
         annotation:(id)info;

アプリデリゲートでメソッドが呼び出されます。このメソッドを使用して、たとえば、アプリが別のプログラムによって起動されたかどうかを示すブールスイッチをtrueに設定できます。

問題は、このメソッドが applicationWillEnterForeground:に呼び出されることです。そのため、このメソッドでは、アプリが手動で起動されたか自動で起動されたかを判断できません。

ただし、特定のメソッドでこれを検出する必要がある場合は、設計上の問題が発生している可能性があり、コードを再編成する必要があると思われます。

于 2012-11-17T07:02:53.157 に答える
1

アプリが別のアプリから開かれた場合、application:openURL:sourceApplication:annotationアプリデリゲートで呼び出されます。

于 2012-11-17T00:02:31.633 に答える