Рассмотрите возможность использования обратного геокодера api, он разрешает CLLocation в CLPlacemark, который содержит название страны, название города и даже название улицы на языке (местном), который вы предпочитаете. Так что в основном ваш код будет похож.
func updateLocation(location: CLLocation) {
CLGeocoder().reverseGeocodeLocation(location, completionHandler: {(placemarks, error)-> Void in
if error != nil {
return
}
if placemarks!.count > 0 {
let placemark = placemarks![0]
print("Address: \(placemark.name!) \(placemark.locality!), \(placemark.administrativeArea!) \(placemark.postalCode!)")
if placemark.locality! !== previousCity) {
// Send push notification
}
} else {
print("No placemarks found.")
}
})
}
РЕДАКТИРОВАТЬ 2
Что касается отправки уведомления, вместо использования UNLocationNotificationTrigger
, просто используйте «обычный триггер» - UNTimeIntervalNotificationTrigger
.
let notification = UNMutableNotificationContent()
notification.title = "Notification"
notification.subtitle = "Subtitle"
notification.body = "body"
let notificationTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 0, repeats: false)
let request = UNNotificationRequest(identifier: "notification1", content: notification, trigger: notificationTrigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
Редактировать 1
Вы не хотите вызывать геокодер очень часто, поэтому вам следует проверять расстояние между текущим местоположением и последней «контрольной точкой», только когда она будет достаточно большой, вы будете вызывать геокодер, иначе это будет пустая трата времени.
Кстати, уведомление будет отправлено с самого телефона, без участия сервера или APNS, это называется локальным уведомлением, а не push-уведомлением.