2016-12-13 2 views
5

Ich habe eine Benachrichtigung mit zwei Aktionen erstellt. Eine meiner Aktionen heißt "Cancel", während die andere "Call" heißt. Wie führe ich die Aktion "Call" dazu, eine URL auszuführen, die in einem Kommentar enthalten ist, den ich meinem Code hinzugefügt habe? Hier ist mein Code:Wie man eine URL erstellt Wird ausgeführt, wenn eine Benachrichtigungsaktion gedrückt wird?

func notificationFires(){ 

    /** 
    URL Code: 

    if let url = URL(string: "tel://") { 
    UIApplication.shared.open(url, options: [:]) 
    } 


**/ 

    let call = UNNotificationAction(identifier:"call", title:"Call", options:[.foreground]) 
    let cancel = UNNotificationAction(identifier: "cancel", title: "Cancel", options: [.destructive ]) 
    let category = UNNotificationCategory(identifier: "category", actions: [call, cancel], intentIdentifiers: [], options: []) 
    UNUserNotificationCenter.current().setNotificationCategories([category]) 

    let notification = UILocalNotification() 
    notification.category = "category" 
    // 2 

    notification.soundName = UILocalNotificationDefaultSoundName 
    notification.fireDate = datePicker.date 

    // 3 
    if textField.text == "" { 

     notification.alertBody = "You have a call right now!" 

    } 
    else{ 

     notification.alertBody = self.textField.text 

    } 
    // 4 
    notification.timeZone = NSTimeZone.default 
    // 5 
    // 6 
    notification.applicationIconBadgeNumber = 1 
    // 7 

    func application(application: UIApplication!, handleActionWithIdentifier identifier:String!, forLocalNotification notification:UILocalNotification!, completionHandler: (() -> Void)!){ 

     if (identifier == "call"){ 
      if let url = URL(string: "tel://2162964785") { 
       UIApplication.shared.open(url, options: [:]) 
      } 
     }else if (identifier == "cancel"){ 

     } 

    } 

    UIApplication.shared.scheduleLocalNotification(notification) 



    func application(application: UIApplication, didReceiveLocalNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 
     print("Recieved: notification") 



     let center = UNUserNotificationCenter.current() 
     center.removeDeliveredNotifications(withIdentifiers: ["notification"]) 




    } 

} 
+0

vielleicht folgendes würde http://useyourloaf.com/blog/openurl-deprecated-in-ios10/ hilfreich sein https://stackoverflow.com/questions/38964264/openurl-in-ios10?rq=1 – CuriousRabbit

Antwort

1

Angenommen, Ihre Mitteilung ordnungsgemäß funktioniert, können Sie zu UNUserNotificationCenterDelegate entsprechen den „Ruf“ Aktion zu behandeln.

Etwas wie:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
     if response.actionIdentifier == "call" { 
      let body = response.notification.request.content.body 

      if let url = URL(string: "tel://\(body)") { 
       UIApplication.shared.open(url, options: [:], completionHandler: nil) 
      } 
     } 
    } 

Die body konstant an die Telefonnummer eingestellt werden würde, das Sie „öffnen“ wollen.

Auch ist es wichtig zu beachten, dass dies auf einem tatsächlichen Gerät getestet werden muss. Das Öffnen eines tel Schemas macht im Simulator nichts.

UNUserNotificationCenterDelegate API-Referenz:https://developer.apple.com/reference/usernotifications/unusernotificationcenterdelegate

EDIT:

Sie rufen Sie nicht die delegierte Methode. Stattdessen implementierst du es. Die Delegate-Methode wird von der UNUserNotificationCenter aufgerufen.

Damit dies funktioniert, ist es wichtig sicherzustellen, dass Sie die Delegat-Eigenschaft UNUserNotificationCenter.current() auf eine Klasse setzen, die dem UNUserNotificationCenterDelegate-Protokoll entspricht.

Zum Beispiel, wenn Sie Ihre Anmeldung in Ihrem AppDelegate sind Handling, können Sie so etwas wie die folgende Methode haben:

func callNotification() { 
    let center = UNUserNotificationCenter.center() 

    // TODO: - Create your actions, category, content, trigger and request... 

    center.delegate = self // Important! 

    center.removeAllPendingNotificationRequests() 
    center.add(request, withCompletionHandler: nil) 
} 

Die oben beschriebene Methode wäre verantwortlich für Ihre Mitteilung zu definieren und es planen. Der Kürze halber habe ich den gesamten Code weggelassen, der die Benachrichtigung definieren würde, da Sie angegeben haben, dass dies funktioniert. Stattdessen sollten Sie beachten, dass die Eigenschaft delegate auf self festgelegt ist.

Dann in einer Erweiterung würden Sie die AppDelegate entsprechen der UNUserNotificationCenterDelegate und implementieren Sie die erforderlichen Methoden.

extension AppDelegate: UNUserNotificationCenterDelegate { 
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
     if response.actionIdentifier == "call" { 
      let body = response.notification.request.content.body 

      if let url = URL(string: "tel://\(body)") { 
       UIApplication.shared.open(url, options: [:], completionHandler: nil) 
      } 
     } 
    } 
} 

Nun, da Ihre AppDelegate zum UNUserNotificationCenterDelegate Protokoll entspricht und Sie setzen self (AppDelegate) als UNUserNotificationCenter ‚s Delegierter, Ihre Implementierung der userNotification(_:didReceive:withCompletionHandler:) Methode aufgerufen.

+0

Das hat nicht funktioniert – krish

+0

@Krish Haben Sie einen Fehler erhalten? Hast du am Simulator oder einem echten Gerät getestet? Wird die Benachrichtigung angezeigt? –

+0

Nein Ich habe keinen Fehler erhalten, und ich habe es an meinem Telefon getestet. Die Benachrichtigung wird eingeblendet, obwohl ich nur auf die Schaltfläche "Anrufen" klicke und mich nur in die App bringe, anstatt die URL aufzurufen, um jemanden anzurufen. – krish

Verwandte Themen