web-dev-qa-db-ja.com

アプリがフォアグラウンドにあるときに、didReceiveRemoteNotificationが呼び出されず、didReceiveRemoteNotification:fetchCompletionHandlerが呼び出されるのはなぜですか?

オーバーライドした場合

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
    println("hey)
}

プッシュ通知を送信すると、フォアグラウンドでアプリを使用してメソッドが正常に呼び出されます。

オーバーライドした場合

override func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    println("hey")
}

フォアグラウンドでアプリを使用して通知を送信すると、メソッドが呼び出されません。アプリがフォアグラウンドにある場合、最初のものは機能するのに2番目のものは機能しないのはなぜですか?

一度に実装しているのはこれらのうちの1つだけであることに注意してください。同時に両方ではありません。

13
Adam Johns

Ios <7(導入時)をサポートする必要がない限り、コールバックバージョンを使用する必要があります。 Swiftを使用しているので、そうではないと思います。

古い方法はios3に戻り、名前以外はすべて非推奨になります。

可能な限り、このメソッドの代わりにapplication:didReceiveRemoteNotification:fetchCompletionHandler:メソッドを実装してください。デリゲートが両方のメソッドを実装している場合、アプリオブジェクトはapplication:didReceiveRemoteNotification:fetchCompletionHandler:メソッドを呼び出します。

古いバージョンでは、アプリがライブ(フォアグラウンドまたはバックグラウンド)であるか、コールドスタートから起動するかによっても異なる結果が得られます。後者の場合、呼び出されないため、infoDictを取得するには、launchOptionsdidFinishLaunchingWithOptions辞書をインターセプトする必要があります。

リモート通知が到着したときにアプリが実行されていない場合、メソッドはアプリを起動し、起動オプションディクショナリに適切な情報を提供します。アプリは、そのリモート通知を処理するためにこのメソッドを呼び出しません。

コールバックバージョンを使用します。それはすべての場合に機能します。 完了ハンドラー/ブロックを使用する必要はありません、その場合、効果は同じです(まあ、新しい方法とより一貫性があります)。

更新

申し訳ありませんが、Appleはあなたにdoは「できるだけ早く」完了ブロックを呼び出さなければならないと言います-30秒ありますOSがあなたをあきらめる前にそうすること。これがあなたの警告の原因かもしれません。

通知の処理が終了したらすぐに、ハンドラーパラメーターでブロックを呼び出す必要があります。そうしないと、アプリが終了します。アプリには、通知を処理して指定された完了ハンドラブロックを呼び出すための最大30秒の実時間があります。実際には、通知の処理が完了したらすぐにハンドラブロックを呼び出す必要があります。

したがって、完了ブロックを呼び出します。

        completionHandler(UIBackgroundFetchResult.NoData)

私はこのメソッドを使用せずにその完了ブロックを呼び出さず、問題は発生していませんが、安全のためにここで追加します。 Appleは、そうしないとアプリがフォアグラウンドにならないことを示唆していますが、実際には見たことがありません。

15
foundry

少なくとも1つのUIUserNotificationTypeUIApplication:registerUserNotificationSettings:に登録しましたか?

バッジ、サウンド、またはアラートに登録しない場合は、FetchCompletionHandlerでのみ配信されるサイレント通知のみを受信できます。

0
user1055568