2017-07-18 53 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中添加代碼並添加變量並添加應用程序委託的擴展。 –

相關問題