Триггерное уведомление при переезде в другой город - PullRequest
0 голосов
/ 03 ноября 2018

Я хочу вызывать уведомление каждый раз, когда текущий город меняется на основании didUpdateLocations:

func locationManager(_ manager: CLLocationManager,  didUpdateLocations locations: [CLLocation]) {
    let lastLocation = locations.last!
    updateLocation(location: lastLocation)
}

Итак, я бы сравнил, изменился ли город, и отправил бы push-уведомление на основании этого. Как я мог это сделать?

func updateLocation(location: CLLocation) {
    fetchCityAndCountry(from: location) { city, country, error in
        guard let city = city, let country = country, error == nil else { return }
        self.locationLabel.text = city + ", " + country
        if(city !== previousCity){
          //Send push notification
        }
    }
}

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

1 Ответ

0 голосов
/ 04 ноября 2018

Рассмотрите возможность использования обратного геокодера 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-уведомлением.

...