2017-07-28 14 views
0

毎日特定の時刻に通知を発信できるようにローカル通知システムをセットアップしました。この時間はユーザーによって決定され、私はそれをストリングとして保管します。私はコードに従って行ったすべてのステップを打ち破りますが、基本的に私の問題は通知が発生しないということです。カレンダーベースのローカル通知が機能しない - スウィフト3

ステップ1:このステップIのセットアップで 通知を送信する許可を依頼する警告:

let center = UNUserNotificationCenter.current() 
let options: UNAuthorizationOptions = [.alert, .badge, .sound] 
center.requestAuthorization(options: options) { (granted, error) in 
    if granted { 
     application.registerForRemoteNotifications() 
    } 
} 

ステップ2:このステップIのセットアップで 私は通知を送信するために呼び出す機能:

static func sendNotification(stringDate: String) { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "HH:mm" 

     let content = UNMutableNotificationContent() 
     content.title = "Title" 
     content.body = "Detail" 
     content.badge = 1 

     if let date = dateFormatter.date(from: stringDate) { 
      let calendar = Calendar.current 

      let hour = calendar.component(.hour, from: date) 
      let minute = calendar.component(.minute, from: date) 

      var dateComponents = DateComponents() 
      dateComponents.hour = hour 
      dateComponents.minute = minute 

      let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true) 
      let request = UNNotificationRequest(identifier: "dateDone", content: content, trigger: trigger) 

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

ステップ3: 私はそのようにように私のアプリデリゲートファイルでこの関数を呼び出す:

func applicationDidEnterBackground(_ application: UIApplication) { 
    let defaults = UserDefaults.standard 
    if defaults.object(forKey: "currentUser") != nil { 
     if User.current.desiredTimeForNews.characters.contains("A") { 
      let stringToBeConverted = User.current.desiredTimeForNews.replacingOccurrences(of: "AM", with: "") 
      HelperFunctions.sendNotification(stringDate: stringToBeConverted) 

     } else { 
      let stringToBeConverted = User.current.desiredTimeForNews.replacingOccurrences(of: "PM", with: "") 
      HelperFunctions.sendNotification(stringDate: stringToBeConverted) 
     } 
    } 
} 

重要::私の機能でわかるように、私は "stringDate"パラメータを取ります。この変数の文字列値はmy dateです。これを日付の値に変換します。ブレークポイントと印刷ステートメントを使用することで、私の日付、時間、分などのすべての値はすべてゼロではないことがわかりました。

私の問題は、通知が送信されないことです。しかし、私はそれを証明するためにブレークポイントを使用したので、それが呼び出されるという事実を知っています。どんな助けもありがとう!

+0

通知を追加した後、あなたは 'UNUserNotificationCenter.current()を呼び出す必要がありgetPendingRequests'とあなたの通知は、実際に次のチェックと一緒に追加されているかどうかを確認します。通知の銃撃戦。 –

+0

これが追加されました。それが正しい時と分の値で私に正しい要求情報を示したことを追加した後。問題は私がシミュレータ上でこれを実行していることでしょうか? –

+0

私はSimulatorで多くのテストを実行しましたが、動作しますが、断続的に動作しません。明確にするには、設定アプリの通知設定は何ですか? – AlexK

答えて

0

私にとって個人的には、実際のデバイスで実行していました。それはシミュレータで動作するはずですが、それは私のためではありませんでした。だから私は何かを見てみる前に、実際のデバイスでそれを試して実行しようと思います!

0

コードは正常であるようです。デバイスとシミュレータ上で動作する必要があります。私の推測では、calendar.timezoneまたはdateformatter.timezoneのいずれかでタイムゾーンに問題があると思われます。その後、トリガー時間はちょうど別の時間に起こり、次にあなたが期待するものです。 詳細を確認するために、セットアップ後の下には、このチェックを挿入します。

UNUserNotificationCenter.current() 
.getPendingNotificationRequests(completionHandler: { requests in 
    for (index, request) in requests.enumerated() { 
    print("notification: \(index) \(request.identifier) \(request.trigger)") 
    } 
    }) 
関連する問題