2017-01-04 9 views
4

UNTimeIntervalNotificationTriggerUNUserNotificationCenterDelegateのiOS 10.2で奇妙なバグが発生しています。基本的に私が作成した通知は、すぐにデリゲートによって取得され、正しい内部で再度取得されています。これは、トリガーでrepeatプロパティがtrueに設定されている場合にのみ発生します。iOS 10.2 UNUserNotificationCenterDelegate/UNTimeIntervalNotificationTriggerバグ?

他にもこの問題がありますか?今私はデリゲートのトリガー日付をチェックし、登録された登録日付と比較する必要があると考えていますが、可能ならばそれを避けたいと思います。

サンプルコードは、私は偽の繰り返しにトリガを変更した場合

let content = UNMutableNotificationContent() 
content.body = "My notification message" 
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true) 
let request = UNNotificationRequest(identifier: "MY_IDENTIFIER", content: content, trigger: trigger) 

UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 

UNUserNotificationCenterDelegateが.add

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
     // Code called here instantly when trigger repeats = true 
     // Code called again at proper interval as well (60 seconds) 
} 

直後に解雇された通知を作成するには、これはを発生しません。

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: false) 
+0

文書では、「繰り返しがtrueの場合、timeIntervalパラメータの値は60秒以上にする必要があります。あなたがライン上にいるので、より大きな間隔を選び、何が起こるかを見る方が良いのではないかと思うようになります。 – matt

+0

実際には複数日設定されていますが、ここでサンプルコードを60に変更しました。 –

答えて

0

私はまだ根本的な問題を発見していないか、または誰かがこの問題を見たことがあると聞いたことがあります。その間、これは私の修正でした(私はそれがちょうど正常に機能したと思うが)。

通知が送信された時間を格納する辞書を作成しました。私はキーとして通知識別子を使用します。

scheduledTimes[identifier] = CACurrentMediaTime() 
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 

はその後、デリゲートでは、私はそれを無視するかべきではないかどうかを確認するために、現在の時刻と比較することができます:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    let identifier = notification.request.identifier 

    // Required for 10.2? 
    // Adding a notification request to the notification center immediately fires this delegate when the trigger is set to repeat 
    if let scheduledTime = scheduledTimes[identifier] { 
     if CACurrentMediaTime() - scheduledTime < 1.0 { 
      completionHandler([]) 
      return 
     } 
    } 

    // Parse the notification into an internal notification and show it 

    completionHandler([]) 
} 

時間加える間デリゲートコールは非常に短く、平均0.04のようなものです。

関連する問題