26

Apple ガイドによると:

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

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

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

前もって感謝します!

4

5 に答える 5

40

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

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

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

于 2012-07-02T09:11:35.067 に答える
16

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

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

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

  • 前景:

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

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

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

  • バックグラウンド

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

      //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
      }
      
  • まったく実行されていません

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

      //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 プッシュ通知の制限をお読みください。

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

于 2015-09-26T09:27:47.130 に答える
3

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

AppDelegate で

- (void)applicationWillEnterForeground:(UIApplication *)application
{ 
    newMessages = application.applicationIconBadgeNumber;
}
于 2015-03-03T16:18:37.133 に答える
1

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

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

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

于 2012-07-02T09:12:06.210 に答える
-2

次のコードを使用できます。

 NSArray *pendingNotifications = [[[UIApplication sharedApplication] scheduledLocalNotifications] sortedArrayUsingComparator:^(id obj1, id obj2)                       {

        if ([obj1 isKindOfClass:[UILocalNotification class]] && [obj2 isKindOfClass:[UILocalNotification class]])
        {
            UILocalNotification *notif1 = (UILocalNotification *)obj1;
            UILocalNotification *notif2 = (UILocalNotification *)obj2;
            return [notif1.fireDate compare:notif2.fireDate];
        }

        return NSOrderedSame;
 }];

 // if there are any pending notifications -> adjust their badge number
 if (pendingNotifications.count != 0)
 {
     //do something
 }
于 2014-08-27T17:38:53.880 に答える