我创建了一个包含两个操作的通知。我的一个动作叫做“取消”,而另一个叫做“呼叫”。如何使“调用”操作运行我添加到代码中的注释中的URL。这是我的代码:
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 :(得分:1)
假设您的通知工作正常,您可以符合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)
}
}
}
body
常量将设置为您想要的电话号码"打开"。
此外,重要的是要注意这必须在实际设备上进行测试。打开tel
方案在模拟器中什么都不做。
UNUserNotificationCenterDelegate API参考: https://developer.apple.com/reference/usernotifications/unusernotificationcenterdelegate
修改强>
您不会调用委托方法。相反,你实现它。委托方法由UNUserNotificationCenter
调用。
为了使其正常工作,确保将UNUserNotificationCenter.current()
委托属性设置为符合UNUserNotificationCenterDelegate
协议的类非常重要。
例如,如果您在AppDelegate
处理通知,则可能会遇到以下方法:
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)
}
上述方法将负责定义通知并安排通知。为简洁起见,我已经省略了所有定义通知的代码,因为您表明这是有效的。相反,您应该注意delegate
属性设置为self
。
然后在扩展程序中,您可以使AppDelegate
符合UNUserNotificationCenterDelegate
并实施所需的方法。
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)
}
}
}
}
现在,因为您的AppDelegate
符合UNUserNotificationCenterDelegate
协议,并且您将self
(AppDelegate
)设为UNUserNotificationCenter
代表,< 1}}方法的强>你的实现。