Как отображать уведомления маяка только один раз в день в Swift? - PullRequest
0 голосов
/ 15 сентября 2018

Мое уведомление маяка срабатывает в любое время при обнаружении сигнала маяка. Как я могу ограничить это, чтобы получать уведомления только один раз в день?

Я реализовал проверку даты, но это не помогло. Проверка if / else работает нормально, но уведомления маяка запускаются независимо от этой проверки

Любое предложение для обходного пути высоко ценится!

Вот мой фрагмент кода:

class ViewController: UIViewController, CLLocationManagerDelegate {

    let locationManager = CLLocationManager()

    let date = Date()
    let calendar = Calendar.current

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.delegate = self
        locationManager.requestAlwaysAuthorization()
        locationManager.desiredAccuracy = 10
        locationManager.distanceFilter = 100
        locationManager.startUpdatingLocation()


        let year = calendar.component(.year, from: date)
        let month = calendar.component(.month, from: date)
        let day = calendar.component(.day, from: date)
        let currentDate = "\(year)\(month)\(day)"
        var savedDate = UserDefaults.standard.string(forKey: "savedDate") ?? "12345"

        print(currentDate)
        print(savedDate)

        if (savedDate == currentDate){
            print("same date - no action")
        } else {
            savedDate = currentDate
            UserDefaults.standard.set(savedDate, forKey: "savedDate")
            print(savedDate + " execute program")

            let beaconRegion = CLBeaconRegion(proximityUUID: UUID(uuidString: "13D9F4C7-A68D-46F4-8D35-4BA7F64BC417")!, identifier: "estimote")
            beaconRegion.notifyOnEntry = true
            beaconRegion.notifyOnExit = false

            let content = UNMutableNotificationContent()
            content.title = "? Daily beacon check! ?"
            content.subtitle = "Receive a new info every day!"
            content.body = "ONLY ONCE A DAY WE SUPPLY INFO!"
            content.sound = .default
            content.badge = 1

            let trigger = UNLocationNotificationTrigger(region: beaconRegion, repeats: true)
            let identifier = "estimote"
            let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: trigger)
            UNUserNotificationCenter.current().removeAllPendingNotificationRequests()

            UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
            UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in
            })

            self.locationManager.startRangingBeacons(in: beaconRegion)

        }
    }

1 Ответ

0 голосов
/ 16 сентября 2018

Установив

let trigger = UNLocationNotificationTrigger(region: beaconRegion, repeats: true)
let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: trigger)

Вы в основном говорите программе отключиться и автоматически доставить уведомление при выполнении условия beaconRegion.Это удобно, если вы всегда хотите получить уведомление и позволить системе обработать его для вас.Но у вас нет возможности вмешаться в этот момент, поскольку это происходит автоматически.

Что вы можете сделать, это обработать уведомления вручную и проверить, следует ли отправлять уведомление каждый раз при обнаружении маяка.Для этого используйте функцию делегата locationManager(didRangeBeacons beacons:in region:):

let locationManager = CLLocationManager()
override func viewDidLoad() {
    super.viewDidLoad()

    // Setup beacon tracking once
    locationManager.delegate = self
    locationManager.requestAlwaysAuthorization()
    locationManager.desiredAccuracy = 10
    locationManager.distanceFilter = 100
    locationManager.startUpdatingLocation()
    let beaconRegion = CLBeaconRegion(proximityUUID: UUID(uuidString: "13D9F4C7-A68D-46F4-8D35-4BA7F64BC417")!, identifier: "estimote")
    beaconRegion.notifyOnEntry = true
    beaconRegion.notifyOnExit = false

    // Start looking for beacons
    self.locationManager.startRangingBeacons(in: beaconRegion)
}

// Handle beacons in range
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
    let now = Date()
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyyMMdd"
    let nowString = formatter.string(from: now)

    // Check if notified ever (lastTime != nil) and if notified today
    if let lastTime = UserDefaults.standard.string(forKey: "savedDate"), lastTime == nowString {
        // Already notified today, skip
        print("same date - no action")
        return
    }

    // Your notification code
    let content = UNMutableNotificationContent()
    content.title = "? Daily beacon check! ?"
    content.subtitle = "Receive a new info every day!"
    content.body = "ONLY ONCE A DAY WE SUPPLY INFO!"
    content.sound = UNNotificationSound.default()
    content.badge = 1

    let identifier = "estimote"
    let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: nil)

    UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in
        if error != nil {
          print("Error showing notification: \(error!.localizedDescription)")
        } else {
          print("Notification shown")
        }
    })

    UserDefaults.standard.set(nowString, forKey: "savedDate")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...