2017-07-18 25 views
5

我的代码使用datePicker,即当datePicker发生更改并匹配用户设备的当前日期时。它发出通知。然而,AVSpeechUtterance我一旦datePickers时间发生变化,就不会在通知出现时触发。我希望AVSpeechUtterance和通知被同时解雇。只有在通知出现后才会触发火灾行动(swift3)

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) 
}} 

APP DELEAGATE

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) 


} 

    } 

error message

回答

0

你有没有试着用设置preUtteranceDelay为AVSpeechUtterance?

1

您可以在收到通知时执行语音操作。要达到此目的,您可以:

如果您低于iOS 10,则可以使用application:didReceiveLocalNotification:UIAppplicatinoDelegate然后开始讲话。

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

如果您使用的是iOS 10+,则可以使用UNUserNotificationCenterDelegateExamplehere您可以看一下示例实现。

+0

如果你告诉我如何实现这一点,我会给你点。我需要实现这个应用程序委托吗? –

+0

更新了答案,查看了一下。 – valcanaia

+0

我是否将我的语音代码放入应用程序委托或vc中? –

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]) 
     } 
    } 
} 

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

+0

嗨,Sam Burns我写了所有的代码。请检查并让我知道它的工作与否。在我身边,它完美的工作。 –

+0

在应用程序委托中发生了什么? –

+0

嗨,Sam Burns。我没有编写应用程序委托的所有代码。所需的功能和代码是为应用程序委托书写的。在didFinishLaunchingWithOptions中添加代码并添加变量并添加应用程序委托的扩展。 –

相关问题