web-dev-qa-db-ja.com

アプリアイコンをタップするなど、さまざまなユーザーアクションを持つすべてのiOSプッシュ通知をキャッチする方法

Appleガイドに従って:

「表示された通知の結果、ユーザーはアラートのアクションボタンをタップするか、アプリケーションアイコンをタップ(またはクリック)します。アクションボタンがタップされた場合(iOSを実行しているデバイス上)、システムはアプリケーションとアプリケーションを起動しますデリゲートのapplication:didFinishLaunchingWithOptions:メソッド(実装されている場合)を呼び出し、通知ペイロード(リモート通知の場合)またはlocal-notificationオブジェクト(ローカル通知の場合)を渡します。

IOSを実行しているデバイスでアプリケーションアイコンをタップすると、アプリケーションは同じメソッドを呼び出しますが、通知に関する情報は提供しません。 Mac OS Xを実行しているコンピューターでアプリケーションアイコンをクリックすると、アプリケーションはデリゲートのapplicationDidFinishLaunching:メソッドを呼び出します。このメソッドでは、デリゲートがリモート通知ペイロードを取得できます。」

私の質問は、ユーザーがプロバイダーから3〜4のプッシュ通知を受け取り、すべてがAppleの通知センターに格納されていると仮定します。ユーザーが通知アラートをタップした場合、ユーザーはアプリで通知データを簡単に取得できます。しかし、ユーザーがiPhoneでアプリのアイコンをタップした場合、以前のすべての通知に関連するすべてのデータを取得する方法。

前もって感謝します!

26
Kirity

できません。アプリを開くために使用された通知に関する情報のみを受け取ります。

したがって、ユーザーがアプリを開いたときに、アプリに通知がある場合、アプリで通知を取得することはできません。

回避策としては、サーバーで通知を追跡し、これをアプリで処理することもできます。したがって、サーバーはどの通知が読み取られたかを追跡します。これがFacebookのやり方です。

40
rckoenes

これを正しく行うには、いくつかの条件を満たす必要があります。

サーバーは、アプリが現在見ているものと、アプリがもう一度送信できる通知を認識しています。

リモート通知のみを検討してみましょう。アプリには3つの状態があります。

  • [〜#〜]前景[〜#〜]

    • ユーザーのアクションなしで通知が表示されます:

      _func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      }
      _

    サードパーティのライブラリを使用してバナーを表示できます: BSForegroundNotification

  • [〜#〜]背景[〜#〜]

    • 画面に通知が表示されます。 (プッシュ通知でcontent-available = 1を設定すると、didReceive ...のように、アプリアイコンが押されると最新のプッシュメッセージが表示される可能性があることに注意してくださいisと呼ばれます)。

      _//nothing is called in the app, but app icon badge changes
      // OR - if the notification contains the field content-available set to 1 - 
      func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      } 
      _
    • ユーザーは通知をタップします

      _func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
          //handle your notification
      }           
      _
    • ユーザーは通知アクションを実行します

      _func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action
      }
      _

      または

      _func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action response info
      }
      _
    • ユーザーがアプリのアイコンをタップする

      _func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      _
  • 実行していないAT ALL

    • 画面に通知が表示されます。

      _//nothing is called in the app, but app icon badge changes
      _
    • ユーザーは通知をタップします

      _func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
          if let userInfo = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? [NSObject: AnyObject] {
              //handle your notification
          }
      }
      _
    • ユーザーは通知アクションを実行します

      _func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action
      }
      _

      または

      _func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [NSObject : AnyObject], withResponseInfo responseInfo: [NSObject : AnyObject], completionHandler: () -> Void) {
           //handle your notification's action response info
      }
      _
    • ユーザーがアプリのアイコンをタップする

      _func applicationDidBecomeActive(application: UIApplication) {
          //fetch pending notifications from server
      }
      _

通知の処理方法

  1. let notification = WLNotification(userInfo: userInfo)

    WLNotification内では、通知を受け取ったときに現在のアプリケーションの状態を維持することを忘れないでください。将来、その通知がどこから来たかを知るためにそれが必要になるかもしれません。

  2. WLNetworkClient.sharedClient().notificationForIdentifier(notification.identifier)

    その通知に関するサーバーの詳細からフェッチし、同時にその通知を本当に受け取り、ユーザーのデータに影響を与えたことを通知します。

保留中のすべての通知を取得する方法

_WLNetworkClient.sharedClient().pendingNotificationsWithCompletionBlock(nil)
_

見逃したすべての通知を取得します。つまり、サーバーで受信済みとしてマークされていないものをフェッチします。

Apple Push Notifications の制限事項)をお読みください。

関連する質問を参照してください:

私は同じ問題を抱えていました。ユーザーがプッシュバナーをクリックした場合、アプリ内にプッシュの情報が表示され、アプリアイコンをクリックした場合、取得できません。それから派生したものを処理できますが、いくつかの制限があります。例:プッシュからバッジ番号を取得したい場合は、次のようにできます(プッシュ->アプリアイコン->アプリアイコンバッジ-> var)

appDelegate

- (void)applicationWillEnterForeground:(UIApplication *)application
{ 
    newMessages = application.applicationIconBadgeNumber;
}
3
gerram

概念的には、プッシュ通知用のクリックアラートビューが表示された状態でアプリケーションが読み込まれると、アプリケーションがバックグラウンドにある場合、アプリケーションはdidReceiveLocalNotificationデリゲートメソッドで起動されます。この時点では、applicationDidFinishLaunchingデリゲートメソッドは呼び出されていません。

アプリケーションがバックグラウンドにない場合、プッシュ通知に表示されるアラートビューをクリックすると、applicationDidFinishLaunchingメソッドが呼び出されます。

これにより、これらの2つのデリゲートメソッド間の理解が明確になることを願っています。

1
Janak Nirmal