iOS 使用 geofencing/background 位置更新触发通知时的蓝色状态栏
iOS blue status bar while using geofencing/background location updates to trigger Notifications
我有在后台启用位置更新的应用程序代码
locationManager.requestAlwaysAuthorization()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters // less batery ussage
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.allowsBackgroundLocationUpdates = true
我想根据用户地理位置触发本地通知。
notificationCenter.requestAuthorization(options: [.alert, .badge, .sound]) { [weak self] (granted, error) in
guard let self = self else { return }
if granted {
print("NotificationCenter Authorization Granted!")
self.notificationCenter.removePendingNotificationRequests(withIdentifiers: [model.id])
let content = UNMutableNotificationContent()
content.title = model.name
content.body = model.desc
content.categoryIdentifier = "Location Notification"
content.userInfo["model_id"] = model.id
content.sound = UNNotificationSound.default
let region = self.makeRegion(for: model)
let trigger = UNLocationNotificationTrigger(region: region, repeats: true)
let request = UNNotificationRequest(identifier: restaurant.id, content: content, trigger: trigger)
self.notificationCenter.add(request)
}
}
locationManager.startUpdatingLocation()
现在,当应用程序处于前台或后台时,我一直有关于位置更新的蓝色状态栏指示器。我认为一直出现对最终用户来说是一种干扰。
我听说当用户授予 Core Location 的 While in Use 授权状态时会显示此信息。因此,据我所知,我应该只在应用程序处于前台时启用触发此通知(但这里需要进行哪些更改?allowsBackgroundLocationUpdates = false
?)
并且仅在用户已授予始终授权状态时才使用后台用户位置更新。
但奇怪的是,这个蓝色的吟游诗人指示符也会在应用程序处于前台时出现。
更新
好的,我已经设置了“下次询问”,然后始终显示蓝色指示器。
如果有 While in Use 则蓝色指示器仅在背景中。
这里总是没有蓝色指示器。
我考虑添加这样的委托方法
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
print("Core Location authorization status: \(status)")
switch status {
case .authorizedAlways:
locationManager.allowsBackgroundLocationUpdates = true
default:
locationManager.allowsBackgroundLocationUpdates = false
}
}
我认为它应该解决状态栏中蓝色指示器的突兀显示。
唯一的问题是,如果 iOS 13 中的用户选择“使用中”,那么将不会尝试在后台更新位置,因此最后不会显示有关“始终授权”问题的警报,唯一的可能性是用户手动打开设置中的始终?
所以我的问题是如何在 iOS 13 中以这种方式出现关于 Always Authorization 的警报,然后才更改
.allowsBackgroundLocationUpdates = true
到
.allowsBackgroundLocationUpdates = false
问题是你所做的一切都是错误的。
您没有进行后台位置监控,因此您不应该请求始终授权。你不需要,到头来你也得不到。您应该请求 WhenInUse 授权,仅此而已。 (这足以触发通知地理围栏。)
至于蓝条,规则一如既往:你应该设置
locationManager.allowsBackgroundLocationUpdates = true
仅当您已经在更新位置而即将进入后台时,您应该设置
locationManager.allowsBackgroundLocationUpdates = false
当你return到前台时。如果您在更新位置时实际上 运行 不在后台(具有后台功能),则根本不要使用 allowsBackgroundLocationUpdates
。
做好自己该做的,一切都会好起来的。
我有在后台启用位置更新的应用程序代码
locationManager.requestAlwaysAuthorization()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters // less batery ussage
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.allowsBackgroundLocationUpdates = true
我想根据用户地理位置触发本地通知。
notificationCenter.requestAuthorization(options: [.alert, .badge, .sound]) { [weak self] (granted, error) in
guard let self = self else { return }
if granted {
print("NotificationCenter Authorization Granted!")
self.notificationCenter.removePendingNotificationRequests(withIdentifiers: [model.id])
let content = UNMutableNotificationContent()
content.title = model.name
content.body = model.desc
content.categoryIdentifier = "Location Notification"
content.userInfo["model_id"] = model.id
content.sound = UNNotificationSound.default
let region = self.makeRegion(for: model)
let trigger = UNLocationNotificationTrigger(region: region, repeats: true)
let request = UNNotificationRequest(identifier: restaurant.id, content: content, trigger: trigger)
self.notificationCenter.add(request)
}
}
locationManager.startUpdatingLocation()
现在,当应用程序处于前台或后台时,我一直有关于位置更新的蓝色状态栏指示器。我认为一直出现对最终用户来说是一种干扰。
我听说当用户授予 Core Location 的 While in Use 授权状态时会显示此信息。因此,据我所知,我应该只在应用程序处于前台时启用触发此通知(但这里需要进行哪些更改?allowsBackgroundLocationUpdates = false
?)
并且仅在用户已授予始终授权状态时才使用后台用户位置更新。
但奇怪的是,这个蓝色的吟游诗人指示符也会在应用程序处于前台时出现。
更新
好的,我已经设置了“下次询问”,然后始终显示蓝色指示器。
如果有 While in Use 则蓝色指示器仅在背景中。
这里总是没有蓝色指示器。
我考虑添加这样的委托方法
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
print("Core Location authorization status: \(status)")
switch status {
case .authorizedAlways:
locationManager.allowsBackgroundLocationUpdates = true
default:
locationManager.allowsBackgroundLocationUpdates = false
}
}
我认为它应该解决状态栏中蓝色指示器的突兀显示。 唯一的问题是,如果 iOS 13 中的用户选择“使用中”,那么将不会尝试在后台更新位置,因此最后不会显示有关“始终授权”问题的警报,唯一的可能性是用户手动打开设置中的始终?
所以我的问题是如何在 iOS 13 中以这种方式出现关于 Always Authorization 的警报,然后才更改
.allowsBackgroundLocationUpdates = true
到
.allowsBackgroundLocationUpdates = false
问题是你所做的一切都是错误的。
您没有进行后台位置监控,因此您不应该请求始终授权。你不需要,到头来你也得不到。您应该请求 WhenInUse 授权,仅此而已。 (这足以触发通知地理围栏。)
至于蓝条,规则一如既往:你应该设置
locationManager.allowsBackgroundLocationUpdates = true
仅当您已经在更新位置而即将进入后台时,您应该设置
locationManager.allowsBackgroundLocationUpdates = false
当你return到前台时。如果您在更新位置时实际上 运行 不在后台(具有后台功能),则根本不要使用 allowsBackgroundLocationUpdates
。
做好自己该做的,一切都会好起来的。