我的代码使用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
答案 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])
}
}
}
============