2016-09-08 32 views
8

Dzięki temu mogę planować powiadomienia takie jak te;Sposób obsługi funkcji UserNotifications Akcje w systemie iOS 10

//iOS 10 Notification 
if #available(iOS 10.0, *) { 

    var displayDate: String { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = DateFormatter.Style.full 
     return dateFormatter.string(from: datePicker.date as Date) 
    } 
    let notif = UNMutableNotificationContent() 


    notif.title = "I am a Reminder" 
    notif.subtitle = "\(displayDate)" 
    notif.body = "Here's the body of the notification" 
    notif.sound = UNNotificationSound.default() 
    notif.categoryIdentifier = "reminderNotification" 

    let today = NSDate() 
    let interval = datePicker.date.timeIntervalSince(today as Date) 

    let notifTrigger = UNTimeIntervalNotificationTrigger(timeInterval: interval, repeats: false) 

    let request = UNNotificationRequest(identifier: "reminderNotif", content: notif, trigger: notifTrigger) 

    UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in 
     if error != nil { 
      print(error) 
      // completion(Success: false) 
     } else { 
      //completion(Sucess: true) 
     } 
     }) 
} 

prosić o uprawnieniach w appDelegate i powiadomienia pojawiają się w porządku z moim zdaniem przy użyciu niestandardowego rozszerzenia powiadomień.

Dodałem powiadomienia o kategorii powiadomień do kategorii appDelegate; one również się pojawiają.

//Notifications Actions 

private func configureUserNotifications() { 
    if #available(iOS 10.0, *) { 

     let tomorrowAction = UNNotificationAction(identifier: "tomorrowReminder", title: "Remind Me Tomorrow", options: []) 

     let dismissAction = UNNotificationAction(identifier: "dismissReminder", title: "Dismiss", options: []) 


     let category = UNNotificationCategory(identifier: "reminderNotification", actions: [tomorrowAction, dismissAction], intentIdentifiers: [], options: [.customDismissAction]) 

     UNUserNotificationCenter.current().setNotificationCategories([category]) 

    } else { 
     // Fallback on earlier versions 
    } 
} 

Mam tę samą kategorię w pliku z rozszerzeniem zgłoszenia .plist. I w rozszerzeniu powiadomień mam następujące elementy, aby zmienić tekst, gdy użytkownik kliknie akcję.

//Handle Notification Actions And Update Notification Window 


private func didReceive(_ response: UNNotificationResponse, completionHandler done: (UNNotificationContentExtensionResponseOption) -> Void) { 

    if response.actionIdentifier == "tomorrowReminder" { 
     print("Tomrrow Button Pressed") 
     subLabel.text = "Reminder For Tomorrow" 
     subLabel.textColor = UIColor.blue 
     done(.dismissAndForwardAction) 
    } 

    if response.actionIdentifier == "dismissReminder" { 
     print("Dismiss Button Pressed") 
     done(.dismiss) 

    } else { 
     print("Else response") 
     done(.dismissAndForwardAction) 
    } 

} 

Tekst jednak się nie zmienia i nie jest wywoływana żadna z instrukcji;

Over w appDelegate Mam następujące;

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { 
    if #available(iOS 10.0, *) { 
     UNUserNotificationCenter.current().delegate = self 
     configureUserNotifications() 

    } 
} 

extension AppDelegate: UNUserNotificationCenterDelegate { 

@available(iOS 10.0, *) 
private func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { 
    completionHandler([.alert, .sound]) 
} 

@available(iOS 10.0, *) 
private func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler:() -> Void) { 

    print("Recieved Action For \(response.actionIdentifier)") 

    if response.actionIdentifier == "tomorrowReminder" { 
     print("Tomorrow Reminder") 


     //Set new reminder for tomorrow using the notification content title 



     completionHandler() 
    } 

    if response.actionIdentifier == "dismissReminder" { 
     print("Dismiss Reminder...") 
     completionHandler() 
    } 
} 

} 

Żadna z tych funkcji są rzeczywiście nazywa się w appDelegate albo. Nie jestem pewien, czy problem z aktualizacją widoku rozszerzenia jest związany z delegatem aplikacji. Nie sądzę, że śledziłem wideo Apple WWDC, a także inne samouczki i patrzę na API dokumentu i nie mogę tego zrozumieć;

  • Dlaczego etykiety tekstowe rozszerzenia powiadomień nie są aktualizowane?
  • Dlaczego funkcje w appDelegate nie są wywoływane?
  • Jak korzystać z treści powiadomień w aplikacji do delegowania, aby użyć działania ?

PS: Spędziłem ostatnie tygodnie badając i próbując to zrozumieć, wydawało mi się to dość proste i nie jestem pewien, czego mi brakuje. Wiem, że nie jestem jedynym, który ma te problemy.

Odpowiedz

4

nie sprawdzili cały kod Ciebie, ale przynajmniej te nagłówki funkcyjne muszą zostać zmienione w następujący sposób:

func userNotificationCenter(_ center: UNUserNotificationCenter, 
          willPresent notification: UNNotification, 
          withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 

func userNotificationCenter(_ center: UNUserNotificationCenter, 
          didReceive response: UNNotificationResponse, 
          withCompletionHandler completionHandler: @escaping() -> Void) { 

func didReceive(_ response: UNNotificationResponse, 
       completionHandler done: @escaping (UNNotificationContentExtensionResponseOption) -> Void) { 

prosta zasada: usuwanie private, dodać @escaping.

Być może otrzymałeś błędne sugestie od Xcode, ale po ich wprowadzeniu private punkty wejścia Objective-C nie są generowane. Środowisko wykonawcze iOS używa wewnętrznie selektorów Objective-C, więc nie może znaleźć swoich metod, a zatem nie są one wykonywane.

+0

Co znaczy "@ escaping"? – Honey

+0

Omg, dziękuję! Czy wiesz, w jaki sposób mogę "notification.request.content.title" w delegacie aplikacji zaplanować nowe powiadomienie? Na przykład próbuję zaplanować przypomnienie i wykonać akcję, aby ponownie przypomnieć o jutrze. –

+0

Nie ma znaczenia, wszystko co potrzebowałem zrobić, to użyć 'response.notification.request.content.title' –