web-dev-qa-db-ja.com

UILocalNotificationがフォアグラウンドまたはバックグラウンドのアプリで起動されたかどうかの判断

UILocalNotificationを受け取ったとき

  1. メソッドapplication:DidReceiveLocalNotificationは、アプリがフォアグラウンドにあるときに呼び出されます。
  2. アプリがバックグラウンドにある場合、アプリはアプリケーションを開き、application:DidReceiveLocalNotificationを呼び出します。

これらのシナリオのどれが発生しているかをどのように判断できますか?私はそれらを異なって扱いたいと思います。

アプリがバックグラウンドにある場合、ユーザーはイベントを見たいことを示しました。ですから、application:DidReceiveLocalNotificationでは、二度と尋ねたくはありません。ただイベントに連れて行きたいだけです。

ただし、通知が発生してapplication:DidReceiveLocalNotificationを呼び出したときにアプリケーションがフォアグラウンドにある場合は、イベントを表示するかどうかをユーザーに確認したいと思います。

本質的に私は持っているでしょう:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

if (appLauncedFromBackground)
  // go to event
else
  // ask if user wants to view event

}

applicationWillEnterForeground:application内のNSUserDefaultにbool値を書き込み、それをapplication:DidReceiveLocalNotification内で読み取ってリセットすることを考えました。しかし、テストする方法があれば、それははるかに良いルートになると思いました。

ありがとう、マーク

編集******************* ***********

Xuzheに感謝しますが、この状況では機能しません。これは、なぜそれが機能しないのかを説明し、誰かが私のためにこれに答えるのを助けるかもしれないもう少し詳細です:

ここで設定しているUILocalNotificationは、ユーザーが選択した時間に発生するようにスケジュールされたカレンダーイベントのようなイベントであるため、通知をスケジュールするときに、通知時にユーザーが何をするのかわかりません。火事。通知のuserInfoを使用して、スケジュールされているイベントに関するデータを保存していますが、提案されているようにinBackgroundのような値を設定しても機能しません。

ユーザーがイベントを「表示」することを決定した場合、2つの状況のいずれかになることを私は知っています。 (これはすべて、アプリがバックグラウンドまたはフォアグラウンドにあり、終了しないことを前提としています)。

1-アプリが使用されていないときに起動し、アプリがバックグラウンドで終了しない場合、iOSはユーザーにイベントが発生したことを通知し、責任のあるアプリ(この場合は私のもの)に移動するためのオプションを提供します)。その時点で、ユーザーが「はい、このクールなアプリに連れて行ってくれ」と言ったとすると、バックグラウンドからアプリが開き、application:DidReceiveLocalNotificationが呼び出され、すべての通知userInfoを取得できます。

2-スケジュールされたイベントが発生したときに、ユーザーがたまたま私のアプリケーションにいることがあります。その時点で、application:DidReceiveLocalNotificationメソッドが再度呼び出され、すべての通知userInfoを取得できます。

しかし、この時点で、2つのシナリオのどちらが1または2で発生したのかを知りたいと思います。

UILocalNotificationの使用に関するこの追加の詳細が、この質問への回答に役立つことを願っています。よろしくお願いします-マーク

編集終了************* ***************

30
Mark Andrews

おそらく最も簡単な方法は、アプリがフォアグラウンドにある場合、LocalNotificationを送信せず、ユーザーをイベントに連れて行くことです。

ただし、LocalNotificationを使用してそれを行うことを主張する場合は、UILocalNotificationが起動されたときのアプリのステータスを検出する簡単な方法があります。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    //[super application:application didReceiveLocalNotification:notification]; // In most case, you don't need this line
    UIApplicationState state = [application applicationState];
    if (state == UIApplicationStateInactive) {
        // Application was in the background when notification was delivered.
    } else {

    }
}
46
xuzhe

これは私がこれらの関数の本体に追加したものです...application didFinishLaunchingWithOptions

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
UILocalNotification *localNotif =
[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
if (localNotif) {  //launched from notification
    [userDefaults setBool:YES forKey:@"deactivate in-app notification"];
    [userDefaults synchronize];
}
else{
    [userDefaults setBool:NO forKey:@"deactivate in-app notification"];
    [userDefaults synchronize];
}

applicationDidEnterBackground

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"deactivate in-app notification"];
[userDefaults synchronize];

applicationWillEnterForeground

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
[userDefaults setBool:YES forKey:@"deactivate in-app notification"];
[userDefaults synchronize];

applicationDidBecomeActive

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
[userDefaults setBool:NO forKey:@"deactivate in-app notification"];
[userDefaults synchronize];

didReceiveLocalNotification

NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
if(![userDefaults boolForKey:@"deactivate in-app notification"]){
    UIAlertView* alert= [[UIAlertView alloc]initWithTitle:@"My App" message:notif.alertBody delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    [alert release];

    NSUserDefaults* userDefaults= [NSUserDefaults standardUserDefaults];
    [userDefaults setBool:NO forKey:@"deactivate in-app notification"];
    [userDefaults synchronize];
}

これで、2つの通知がなくなりました(特に、アプリがバックグラウンドにあり、通知アラートから開いたときに表示される通知です。

1
Sufian

didReceiveLocalNotificationで、アプリケーションの状態を確認できます。

[UIApplication shareApplication].applicationState

UIApplicationStateInactiveと等しい場合は、アプリがバックグラウンドにあり、ユーザーがローカル通知アラートでアプリを開いたことがわかります。

UIApplicationStateActiveの場合は、ユーザーに独自のアラートを表示することをお勧めします。

1
Michael M. C