Установив
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")
}