我已经订阅了一个基于位置的提醒,代码如下:
let center = CLLocationCoordinate2D(latitude: tapp.location.latitude, longitude: tapp.location.longitude)
let region = CLCircularRegion(center: center, radius: CLLocationDistance(tapp.reminder), identifier: tapp.name)
locationManager.distanceFilter = 100
locationManager.startMonitoring(for: region)
region.notifyOnEntry = true
region.notifyOnExit = false
let trigger = UNLocationNotificationTrigger(region: region, repeats: false)
let request = UNNotificationRequest(identifier: "(tapp.location.latitude)|(tapp.location.longitude)", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
当我在 iOS 模拟器中输入某个区域时,该代码可以提醒我,但是当我将应用程序加载到物理设备上并走进该区域时,它永远不会通知我。
我记得读过一些关于低功耗模式的信息,影响您是否可以订阅基于位置的通知,还有其他类似的东西会阻止应用程序接收后台更新吗? 另外,我的代码是否正确?
我也有类似的情况。位置通知在模拟器上触发,在前台、后台和关闭的应用状态下尝试。它在模拟器上的所有情况下都会触发,但在真实设备上,它在任何情况下都不会触发,即使是前台。
这是我的位置权限请求代码
lazy var locationManager: CLLocationManager = createLocationManager()
private func createLocationManager() -> CLLocationManager {
let manager = CLLocationManager()
manager.allowsBackgroundLocationUpdates = true
return manager
}
init() {
super.init()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startMonitoringSignificantLocationChanges()
locationManager.startUpdatingLocation()
locationManager.allowsBackgroundLocationUpdates = true
}
func askForPermissionIfNeeded() {
if CLLocationManager.locationServicesEnabled() {
if !self.isLocationPermissionAsked {
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
}
}
}
这是我请求通知权限的代码
func requestNotificationAuthorization(completion: @escaping () -> Void) {
let options: UNAuthorizationOptions = [.sound, .alert, .badge]
notificationCenter
.requestAuthorization(options: options) { result, _ in
print("Notification Auth Request result: (result)")
completion()
}
}
这是我注册位置通知的代码
private func registerNotification(region: CLRegion) {
let notificationContent = UNMutableNotificationContent()
notificationContent.title = "Active location nearby"
notificationContent.body = "Do you want to bla bla bla?"
notificationContent.sound = .default
let trigger = UNLocationNotificationTrigger(region: region, repeats: false)
let request = UNNotificationRequest(
identifier: region.identifier,
content: notificationContent,
trigger: trigger)
notificationCenter
.add(request) { error in
if error != nil {
print("Error: (String(describing: error))")
}
}
}
所有这些都适用于模拟器,不适用于设备...或者至少没有触发通知
但是我找到了一个解决方法,至少在我的情况下有效 ->区域监控
我总是请求位置权限,并使用位置管理器监视哪些区域,如下所示
locationManager.startMonitoring(for: fenceRegion)
通过使用委托方法didEnterRegion,我在那里注册了一个通知,并将触发器替换为时间触发器而不是位置触发器
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if region is CLCircularRegion {
registerNotification(region: region)
// Replace let timeTrigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false) in registerNotification
}
}
我知道这对所有人来说不一定是一个好的解决方案,但至少就我而言,它是有效的。希望它也能帮助其他人