2017-07-18 69 views
5

Mój kod używa datePicker, który zmienia się po zmianie datePicker i odpowiada aktualnej dacie urządzenia użytkownika. Wystrzeliwuje powiadomienie. Jednak AVSpeechUtterance używam ognia, gdy tylko zmieni się czas datePickers, a nie kiedy pojawi się powiadomienie. Chciałbym, aby AVSpeechUtterance i powiadomienie były uruchamiane w tym samym czasie.wywołać akcję po wyświetleniu powiadomienia (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

Odpowiedz

0

Próbowałeś z ustawieniem preUtteranceDelay dla AVSpeechUtterance?

1

Możesz wykonać czynność związaną z mową, gdy otrzymasz powiadomienie. Aby to osiągnąć, możesz:

Jeśli jesteś poniżej iOS 10, możesz użyć application:didReceiveLocalNotification: na UIAppplicatinoDelegate, a następnie rozpocząć rozmowę.

Pomysł wdrożenia polegałby na sprawdzeniu wartości powiadomienia, aby upewnić się, że jest to "powiadomienie o wiadomości", które zostało wywołane.

Jeśli korzystasz z systemu iOS 10+, możesz skorzystać z wersji UNUserNotificationCenterDelegateExamplehere, aby zapoznać się z przykładową implementacją.

+0

Dam ci punkty, jeśli pokażesz mi, jak to zrealizować. Czy muszę wdrożyć delegata tej aplikacji? –

+0

Zaktualizowano odpowiedź, sprawdź. – valcanaia

+0

Czy umieściłem mój kod mowy w delegacie aplikacji lub 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

Cześć, Sam Burns Napisałem cały kod. Sprawdź i daj mi znać, że to działa, czy nie. W mojej stronie to działa idealnie. –

+0

co dzieje się w ... w delegacie aplikacji? –

+0

Cześć, Sam Burns. Nie napisałem wszystkich kodów delegatów aplikacji.wymagana funkcja i kod zostały napisane dla delegata aplikacji. Dodaj kod do didFinishLaunchingWithOptions i dodaj zmienne i dodaj rozszerzenie delegata aplikacji. –