仅在通知出现后触发动作(swift3)

时间:2017-07-18 18:07:06

标签: ios date swift3 notifications action

我的代码使用datePicker,当datePicker更改并与用户设备的当前日期匹配时。它会发出通知。但是AVSpeechUtterance datePickers一旦AVSpeechUtterance时间发生变化,我就会使用import UIKit import AVFoundation import UserNotifications class ViewController: UIViewController { @IBOutlet var datePicker: UIDatePicker! @IBAction func datePicker(_ sender: Any) { let c = UNMutableNotificationContent() c.title = "Lets Roll" c.subtitle = "s" c.body = "d" let begin = AVSpeechUtterance(string: " Hello ") let synthesizer = AVSpeechSynthesizer() begin.voice = AVSpeechSynthesisVoice(language: "en-US") begin.rate = 0.08 synthesizer.speak(begin) let triggerDate = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: datePicker.date ) let t = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false) let r = UNNotificationRequest(identifier: "any", content: c, trigger: t) UNUserNotificationCenter.current().add(r, withCompletionHandler: nil) }} 。我希望 import AVFoundation import UIKit import UserNotifications enum NotificationName: String { case mySpeechNotification } @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in if error != nil { print("Ops, error trying to get authorization") } else { if !granted { print("Dude, let me use notifications!") } } } } return true } func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { print("Oh, will present a notification, let's see the identifier: \(notification.request.identifier)") if (notification.request.identifier == NotificationName.mySpeechNotification.rawValue) { print("Speaking...") } else { print("Nothing to say...") } completionHandler(.alert) let begin = AVSpeechUtterance(string: " Hello ") begin.voice = AVSpeechSynthesisVoice(language: "en-US") begin.rate = 0.08 let synthesizer = AVSpeechSynthesizer() synthesizer.speak(begin) } } 和通知同时被解雇。

100; boston; 1 newbury street; usa    
201; boston; 1 newbury street; usa    
302; boston; 1 newbury street; usa

APP DELEAGATE

[100,201,302], boston, newbury street, usa

error message

3 个答案:

答案 0 :(得分:1)

您可以在收到通知时执行语音操作。为此,您可以:

如果您的iOS 10以下,可以application:didReceiveLocalNotification:使用UIAppplicatinoDelegate,然后开始发言。

实施的想法是检查通知的某些值,以确保是您触发的“语音通知”。

如果您使用的是iOS 10+,则可以使用UNUserNotificationCenterDelegateExample here来查看示例实现。

答案 1 :(得分:0)

您是否尝试过为AVSpeechUtterance设置 preUtteranceDelay

答案 2 :(得分:0)

import UIKit
import UserNotifications
import UserNotificationsUI //framework to customize the notification

class TestViewController: UIViewController {

    @IBOutlet weak var datePicker: UIDatePicker!
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    override func viewDidLoad() {
        super.viewDidLoad()
        datePicker.addTarget(self, action: #selector(dateChanged(_:)), for: .valueChanged)
    }

    //MARK:- Date Picker Value Changed
    func dateChanged(_ sender: UIDatePicker) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "MMM dd, yyyy"
        let selectedDate = dateFormatter.string(from: datePicker.date)
        let currentDate = dateFormatter.string(from: Date())
        if selectedDate == currentDate{
            self.triggerLocalNotification()
        }
        print(selectedDate)

    }

    //MARK:- Removed all pending notifications
    func removeLocalNotification()  {
        print("Removed all pending notifications")
        let center = UNUserNotificationCenter.current()
        center.removePendingNotificationRequests(withIdentifiers: [appDelegate.requestIdentifier])

    }

    //MARK:- Trigger Local Notification
    func triggerLocalNotification() {
        self.removeLocalNotification()
        let content = UNMutableNotificationContent()
        content.title = "Title"
        content.subtitle = "Subtitle"
        content.body = "Body"
        content.sound = UNNotificationSound.default()
        let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5.0, repeats: false)
        let request = UNNotificationRequest(identifier: appDelegate.requestIdentifier, content: content, trigger: trigger)

        UNUserNotificationCenter.current().add(request){(error) in

            if (error != nil){
                print(error?.localizedDescription)
            }
        }

    }
}

// ============的AppDelegate ======

import UIKit
import  AVFoundation
import  UserNotifications

let center = UNUserNotificationCenter.current()
let requestIdentifier = "SampleRequest" //identifier is to cancel the notification request
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    //Requesting Authorization for User Interactions
    center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in
        // Enable or disable features based on authorization.
    }
    center.delegate = self
    return true
}


extension AppDelegate:UNUserNotificationCenterDelegate{

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    print("Tapped in notification")
}

//This is key callback to present notification while the app is in foreground
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    print("Notification being triggered")
    let begin = AVSpeechUtterance(string: " Hello ")
    begin.voice = AVSpeechSynthesisVoice(language: "en-US")
    begin.rate = 0.08
    let synthesizer = AVSpeechSynthesizer()
    synthesizer.speak(begin)
    //You can either present alert ,sound or increase badge while the app is in foreground too with ios 10
    //to distinguish between notifications
       if notification.request.identifier == requestIdentifier{
            completionHandler( [.alert,.sound,.badge])
       }
    }
}

============