如何实现多个本地通知而不是swift 3的单个通知

时间:2016-12-17 22:16:39

标签: notifications swift3 ios10 localnotification

我使用了单一通知,这是我的代码: 这是用于注册本地通知>>>

    func registerLocal() {
    let center = UNUserNotificationCenter.current()

    center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
        if granted {
            print("Yay!")
        } else {
            print("D'oh")
        }
    }
}

此功能用于安排本地通知>>>

func scheduleLocal() {
    registerCategories()

    let center = UNUserNotificationCenter.current()

    // not required, but useful for testing!
    center.removeAllPendingNotificationRequests()

    let content = UNMutableNotificationContent()
    content.title = "good morning"
    content.body = "ttt123"
    content.categoryIdentifier = "alarm"
    content.userInfo = ["customData": "fizzbuzz"]
    content.sound = UNNotificationSound.default()

    var dateComponents = DateComponents()
    dateComponents.hour = 23
    dateComponents.minute = 18
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)

    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
    center.add(request)
}

func registerCategories() {
    let center = UNUserNotificationCenter.current()
    center.delegate = self

    let show = UNNotificationAction(identifier: "show", title: "Tell me more…", options: .foreground)
    let category = UNNotificationCategory(identifier: "alarm", actions: [show], intentIdentifiers: [])

    center.setNotificationCategories([category])
}

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    // pull out the buried userInfo dictionary
    let userInfo = response.notification.request.content.userInfo

    if let customData = userInfo["customData"] as? String {
        print("Custom data received: \(customData)")

        switch response.actionIdentifier {
        case UNNotificationDefaultActionIdentifier:
            // the user swiped to unlock; do nothing
            print("Default identifier")

        case "show":
            print("Show more information…")
            break

        default:
            break
        }
    }

    // you need to call the completion handler when you're done
    completionHandler()
}

现在我如何在iOS 10和不同时间使用此代码与多个本地通知 谢谢。

5 个答案:

答案 0 :(得分:11)

您可以使用不同的func scheduleLocal()多次呼叫dateComponents,以便在不同日期安排。或者,您可以将一组日期传递给此函数并运行循环以根据这些日期安排通知。

请确保您在UNNotificationRequest(identifier:, content:, trigger:)函数中传递的标识符对于每个通知都不同。

希望这会有所帮助。 :)

答案 1 :(得分:7)

为每个通知使用不同的请求标识符(否则您只能看到最后一个通知)。 在上面的例子中,确保请求标识符" UUID()。uuidString"包含每个通知请求的唯一值。

答案 2 :(得分:2)

使用不同的参数调用此函数。就像我在应用程序变为背景时调用的那样

  func applicationDidEnterBackground(_ application: UIApplication) {

        setNotification(time: 25,identifier: "notific2")
        setNotification(time: 50,identifier: "notific3")
        setNotification(time: 90,identifier: "notific4")
    }


  func setNotification (time : Int,identifier : String)
    {
        let content = UNMutableNotificationContent()
        content.title = "Don't forget"
        content.body = "Buy some milk"
        content.sound = UNNotificationSound.default()
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval(time),
                                                        repeats: false)
        let center = UNUserNotificationCenter.current()
        // Swift
        let request = UNNotificationRequest(identifier: identifier,
                                            content: content, trigger: trigger)
        center.add(request, withCompletionHandler: { (error) in
            if error != nil {
                // Something went wrong
            }
        })
    }

答案 3 :(得分:0)

请注意,您的代码应该按预期工作!然而,有一点陷阱。

我认为我几乎遇到了完全相同的问题,在我尝试跟踪待处理的通知后,我注意到已添加的唯一通知是最后请求的通知。那是因为你正在调用scheduleLocal()函数:

// not required, but useful for testing!
center.removeAllPendingNotificationRequests()

嗯,最好删除任何现有的通知提醒请求,这有助于防止不必要的重复通知,但在调用scheduleLocal()之前,您应该只将其称为

UNUserNotificationCenter.current().removeAllPendingNotificationRequests()
// now you could call this function many times...
scheduleLocal()

简单地说,您不希望在添加后直接删除每个待处理通知,而是删除之前的所有待处理通知并添加新通知。

答案 4 :(得分:0)

如果要使用多个本地通知,则必须为每个请求使用不同的标识符。

let request = UNNotificationRequest(identifier: "Stock Changed", content: content, trigger: nil)

为每个请求使用不同的标识符更改“Stock Changed”。

您可以对多个请求使用循环。