iOS蓝色状态栏同时使用地理围栏/背景位置更新来触发通知

Posted

技术标签:

【中文标题】iOS蓝色状态栏同时使用地理围栏/背景位置更新来触发通知【英文标题】:iOS blue status bar while using geofencing/background location updates to trigger Notifications 【发布时间】:2019-10-18 16:56:42 【问题描述】:

我有在后台启用位置更新的应用程序代码

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 ?)

并且仅在用户授予“始终授权”状态时才使用后台用户位置更新。

但奇怪的是,当应用程序处于前台时,也会出现这个蓝色的 bard 指示器。

更新

好的,我设置了“下次询问”,然后始终显示蓝色指示器。

如果有“使用中”,则蓝色指示器仅在背景中。

它在这里总是根本没有蓝色指示器。

我考虑添加这样的委托方法

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 中以这种方式制作带有始终授权问题的警报,然后才会更改

.allowsBackgroundLocationUpdates = true

.allowsBackgroundLocationUpdates = false

【问题讨论】:

【参考方案1】:

问题是你所做的一切都是错的。

您没有进行后台位置监控,因此您不应该要求始终授权。你不需要它,最后你也得不到它。您应该请求WhenInUse 授权,仅此而已。 (这对于通知地理围栏触发器来说已经足够了。)

至于蓝条,规则一如既往:你应该设置

locationManager.allowsBackgroundLocationUpdates = true

只有当你即将进入后台而你已经在更新位置时,你应该设置

locationManager.allowsBackgroundLocationUpdates = false

当你回到前台时。如果您在更新位置时实际上并未在后台运行(具有后台功能),请不要使用allowsBackgroundLocationUpdates

做你该做的,一切都会好起来的。

【讨论】:

但我也想在应用程序处于后台时触发通知。不仅在应用程序处于前台时。我了解用户应该有可能不允许我选择使用时而不是始终授权。但是现在当我设置allowBackgroundLocationUpdates = false 时,它​​就没有机会被询问这个总是授权。或者也许我应该在应用程序进入后台应用程序 WillEnterBackground 时以某种方式更改此allowBackgroundLocationUpdates。但是 locationManager 应该是单例的还是在 AppDelegate 上定义的? “但我也想在应用程序处于后台时触发通知”我不知道这是什么意思。当您配置通知并将其交给系统时,它不在您的掌控之中。 system 会触发它,即使您的应用程序没有运行。你不需要 Always 授权,而且你从来不需要它。 好吧,它似乎也可以在后台使用 locationManager.allowsBackgroundLocationUpdates = false 所以我认为我被教程误导了,该属性设置为 true 以便发送这个地理围栏触发的通知。

以上是关于iOS蓝色状态栏同时使用地理围栏/背景位置更新来触发通知的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7.1 地理围栏和 iBeacons 停止工作

使用融合位置地理围栏时是不是需要请求位置更新?

使用 iOS 地理围栏跟踪多个(20 多个)位置

位置更新在后台停止 - iOS

地理围栏不再从 ios7 中的终止状态重新启动应用程序?

背景中的地理围栏