web-dev-qa-db-ja.com

アプリケーション:didReceiveRemoteNotification:fetchCompletionHandler:が通知センターで通知をタップして呼び出されたかどうかを検出します

application: didReceiveRemoteNotification: fetchCompletionHandler:

とは異なります

application: didReceiveRemoteNotification:

どうやって?ドキュメントから:

アプリの実行中にのみ呼び出されるapplication:didReceiveRemoteNotification:メソッドとは異なり、システムはアプリの状態に関係なくこのメソッドを呼び出します。アプリが中断または実行されていない場合、システムはアプリを起動または起動し、メソッドを呼び出す前にバックグラウンド実行状態にします。 ユーザーがシステムに表示されたアラートからアプリを開くと、システムはこのメソッドを再度呼び出して、ユーザーが選択した通知を確認します。

私の苦労は次のとおりです。メソッドが、ユーザーが通知センターまたはデバイスを起動するサイレントプッシュ通知からシステム表示アラートをタップして呼び出されたかどうかを知りたいです。現在、私が見る限り、区別する明確な方法はありません。

- (BOOL)application: didFinishLaunchingWithOptions:

上記の方法でlaunchOptionsを追跡することは、アプリがバックグラウンドで中断/実行されていない場合にのみ呼び出されるため、解決策ではありません。バックグラウンドで実行されている場合、呼び出されません。

39
Devfly

Appleのドキュメントは少しわかりにくい

application: didReceiveRemoteNotification: fetchCompletionHandler:  

アプリケーションがリモート通知バックグラウンドモードをサポートしている場合(つまり、BackgroundFetchを実行している場合)が使用されます。

application: didReceiveRemoteNotification:  

oSがRemoteNotificationを受信し、アプリが(バックグラウンド/サスペンドまたはフォアグラウンドで)実行されているときに呼び出されます。

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
      UIApplicationState state = [application applicationState];
        // user tapped notification while app was in background
    if (state == UIApplicationStateInactive || state == UIApplicationStateBackground) {
         // go to screen relevant to Notification content
    } else {
         // App is in UIApplicationStateActive (running in foreground)
         // perhaps show an UIAlertView
    }
}
41
race_carr

UIApplicationapplicationStateを確認して、ユーザーがアクティブに使用しているアプリケーションで行われた呼び出しとサイレント呼び出しを区別できます。

typedef enum : NSInteger {
   UIApplicationStateActive,
   UIApplicationStateInactive,
   UIApplicationStateBackground
} UIApplicationState;

または、delegateapplicationDidEnterBackground:に独自のフラグを設定したままにします。

18
Rivera

コントロールセンターまたはAppleの通知センターをアプリ上で開いている場合、application:didReceiveRemoteNotification:fetchCompletionHandler:が呼び出され、アプリケーションの状態が非アクティブになるため、アプリケーションの状態は信頼できません。

私は、アプリがバックグラウンドにあるときに通知のクリックに応答しようとして同じ問題を抱えており、これを単独で識別する信頼できる方法はないようです。

9
overunder

いつ application: didReceiveRemoteNotification:fetchCompletionHandler:メソッドはアプリの状態と呼ばれます。ユーザーがアラートをタップするとUIApplicationStateInactiveになり(この場合はUIを準備します)、アプリが静かに起動するとUIApplicationStateBackgroundになります(この場合は単に一部のデータを読み込みます)。

3

Swiftの場合

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    let state : UIApplicationState = application.applicationState
    if (state == .Inactive || state == .Background) {
        // go to screen relevant to Notification content
    } else {
        // App is in UIApplicationStateActive (running in foreground)
    }
}
3
Ghulam Rasool

私はあなたの質問を理解しているかどうかわかりません。

サイレントプッシュ通知のバックグラウンドフェッチとノイズの多いプッシュ通知を区別しますか?プッシュ通知ディクショナリに「content-available」キーが含まれているかどうかを簡単に確認できます。[[userInfo objectForKey:@"aps"] objectForKey:@"content-available"]含まれている場合は、サイレントプッシュである必要があります。そうでない場合は、通常のプッシュでした。

アプリケーションが通知を受信し、サスペンド/実行されていないときにバックグラウンドフェッチメソッドが呼び出されるかどうかを知りたいですか?その場合、次のことができます。

  • LumberJacksをダウンロードしてアプリにインポートします。 指示を確認し、ログをディスクに保存できるように設定する方法を学習します。
  • そのメソッドが呼び出されるかどうか/いつ呼び出されるかを確認したい任意のメソッドにこれを配置します。

    • DDLogDebug(@"%@ - %@",NSStringFromSelector(_cmd),NSStringFromClass([self class]));

    これにより、クラスとメソッドがログファイルに出力されます。

  • バックグラウンドフェッチが有効なアプリにプッシュ通知を送信した後、ログファイルを調べ、ログファイルを見てメソッドが呼び出されるかどうかを確認します。

バックグラウンドフェッチ用にアプリを正しく設定している場合、プッシュ通知(サイレントプッシュかどうか)を受信すると、アプリがバックグラウンド/実行されていないときでもapplication: didReceiveRemoteNotification: fetchCompletionHandler:メソッドが呼び出されます。

2
navkast

IOS 10.0以降では、メソッドを使用できます

_- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler;
_

ユーザーがNotificationCenterからシステムに表示されたアラートをタップしたときを検出します。

上記のメソッドを実装する場合

  • - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;が呼び出されますのみ通知が受信されたとき
  • - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler;は、ユーザーが通知をタップしたときに呼び出されます
1
Giorgio

Swiftの場合:application(_:didFinishLaunchingWithOptions:)でアプリケーションオプションを解析します。それらが存在する場合、アプリをタップして起動したことがわかります。

_  if let remoteNotif = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: Any] {
        print("Remote notfi is \(remoteNotif)")
        if let notification = remoteNotif["aps"] as? [AnyHashable : Any] {
        /// - parse notification
      }
  }
_

それ以外の場合は、タップインを処理でき、アプリが開いている/バックグラウンド/非アクティブであることがわかりますapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)

0
Alex Mason