移动到另一个城市时触发通知
Trigger notification when moving to another city
我想在每次当前城市根据 didUpdateLocations
:
发生变化时触发通知
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let lastLocation = locations.last!
updateLocation(location: lastLocation)
}
所以在这里我会比较城市是否发生了变化,并根据它发送推送通知。我该怎么做?
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
}
}
}
我知道我可以根据位置和范围触发它,但这对我来说不够具体。
考虑使用反向地理编码器 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
,只需使用"normal trigger" - 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
你不想经常调用地理编码器,所以你应该检查当前位置和最后一个位置之间的距离"checkpoint",只有当它足够大时才会调用地理编码器,否则会浪费了。
顺便说一句,通知将从 phone 本身发送,不涉及服务器或 APNS,这称为本地通知,而不是推送通知。
我想在每次当前城市根据 didUpdateLocations
:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let lastLocation = locations.last!
updateLocation(location: lastLocation)
}
所以在这里我会比较城市是否发生了变化,并根据它发送推送通知。我该怎么做?
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
}
}
}
我知道我可以根据位置和范围触发它,但这对我来说不够具体。
考虑使用反向地理编码器 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
,只需使用"normal trigger" - 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
你不想经常调用地理编码器,所以你应该检查当前位置和最后一个位置之间的距离"checkpoint",只有当它足够大时才会调用地理编码器,否则会浪费了。
顺便说一句,通知将从 phone 本身发送,不涉及服务器或 APNS,这称为本地通知,而不是推送通知。