Mergulhe profundamente na localização principal no iOS: geofencing (monitoramento de região)

Isso faz parte da série de artigos sobre Deep Dive Into Core Location
- Solicitando localização do usuário
- Geofencing (Monitoramento de Região) (Aqui)
- Monitoramento do local visitado pelo usuário.
- Introdução
- Solicitar permissão de localização
- Configurando Geofencing
- Lidando com erro de geofencing
- Depurando no Simulador
- Conclusão
Geofencing (monitoramento de região) é um limite virtual em torno de uma área geográfica do mundo real. Geofencing é uma forma de notificar nosso aplicativo quando o dispositivo entra ou sai de regiões geográficas configuradas. Por exemplo, permite-nos fazer um aplicativo que pode enviar uma notificação informando a um pai que seu filho saiu ou entrou em uma determinada área, ou um aplicativo que pode habilitar ou desabilitar recursos ao entrar ou sair de uma região.
Embora o Geofencing seja um recurso poderoso que pode agregar valor significativo a um aplicativo iOS, também há algumas desvantagens em potencial a serem consideradas:
- Geofencing requer a aprovação do usuário. Se o usuário rejeitar os serviços de localização, o geofencing não funcionará
- Geofencing requer monitoramento de localização contínuo, o que pode levar a um consumo significativo de bateria
- Geofencing depende de recursos de hardware específicos
- Geofencing requer acesso aos dados de localização do usuário, o que pode levantar questões de privacidade se manuseado de forma inadequada.
Como o recurso de delimitação geográfica precisa acessar a localização do usuário, precisamos solicitar a permissão de localização do usuário para que possamos receber atualizações de localização quando um usuário estiver em segundo plano e em primeiro plano. Se quisermos receber obras de geofencing quando o aplicativo estiver em segundo plano, precisamos solicitar permissão de localização para Sempre permitir
Etapa 1: configurar Info.plist para privacidade de localização
Para obter informações sobre a localização do usuário, precisamos adicionar alguma string no arquivo info.plist . Esta mensagem de string será mostrada quando o aplicativo solicitar permissão
<dict>
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app need your location to provide best feature based on location</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app need your location to provide best feature based on location</string>
</dict>
Como queremos oferecer suporte ao Geofencing para recuperar informações de localização no estado de segundo plano, precisamos garantir que a Location updates
opção esteja selecionada na Background Modes
guia.

Etapa 3: Solicitar sempre permitir permissão
Podemos usar requestAlwaysAuthorization()
para obter permissão para permitir que nosso aplicativo receba atualizações de localização quando nosso aplicativo estiver em segundo plano, mas lembre-se de que, para obter a autorização Always , nosso aplicativo deve primeiro solicitar a permissão When In Use, seguida derequestAlwaysAuthorization()
import UIKit
import CoreLocation
class ViewController: UIViewController {
var locationManager: CLLocationManager?
override func viewDidLoad() {
super.viewDidLoad()
setupLocationManager()
}
private func setupLocationManager() {
locationManager = CLLocationManager()
locationManager?.delegate = self
// Request When In Use user permission
locationManager?.requestWhenInUseAuthorization()
}
}
extension ViewController: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .notDetermined:
print("When user did not yet determined")
case .restricted:
print("Restricted by parental control")
case .denied:
print("When user select option Dont't Allow")
case .authorizedAlways:
print("Geofencing feature has user permission")
case .authorizedWhenInUse:
// Request Always Allow permission
// after we obtain When In Use permission
locationManager?.requestAlwaysAuthorization()
default:
print("default")
}
}
}
Etapa 1: criar a região que queremos monitorar
Para trabalhar com o recurso Geofencing no Core Location, primeiro precisamos criar uma região que será monitorada pelo nosso aplicativo. Podemos centralizar nossa região nas coordenadas que queremos monitorar e especificar o tamanho dela, dando-lhe um raio.
Dos documentos disse:
Ao determinar se ocorreu uma travessia de limite, o sistema espera para ter certeza antes de enviar a notificação. Especificamente, o usuário deve percorrer uma distância mínima sobre o limite e permanecer no mesmo lado do limite por pelo menos 20 segundos. Essas condições ajudam a eliminar chamadas espúrias aos métodos do seu objeto delegado.
Precisamos definir uma região usando uma coordenada central e um raio. Em seguida, podemos usar as APIs de geofencing do Core Location para monitorar a região. Quando o usuário entra ou sai da região, seu app recebe uma notificação.
Quando o usuário entra ou sai da região, seu app recebe uma notificação. O sistema espera que o usuário atravesse a fronteira e permaneça do outro lado por pelo menos 20 segundos antes de enviar a notificação para evitar notificações desnecessárias.
class ViewController: UIViewController {
private func setupGeofencing() {
guard CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) else {
showAlert(message: "Geofencing is not supported on this device")
return
}
guard locationManager?.authorizationStatus == .authorizedAlways else {
showAlert(message: "App does not have correct location authorization")
return
}
startMonitoring()
}
private func startMonitoring() {
let regionCoordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 37.3346438, longitude: -122.008972)
let geofenceRegion: CLCircularRegion = CLCircularRegion(
center: regionCoordinate,
radius: 100, // Radius in Meter
identifier: "apple_park" // unique identifier
)
geofenceRegion.notifyOnEntry = true
geofenceRegion.notifyOnExit = true
// Start monitoring
locationManager?.startMonitoring(for: geofenceRegion)
}
private func showAlert(message: String) {
let alertController = UIAlertController(title: "Information", message: message, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .cancel))
self.present(alertController, animated: true, completion: nil)
}
}
setupGeofencing()
é um método para verificar se o dispositivo suporta o recurso de geofencing e, em seguida, temos que garantir a permissão Sempre Permitir do usuáriostartMonitoring()
é um método para definir uma região que queremos monitorar, declaramos a coordenada dentro delaregionCoordinate
também podemos ajustar o raio de uma região que queremos monitorar- A Apple só permite monitorar 20 regiões, usando
identifier
propriedade emCLCircularRegion
podemos distinguir uma região da outra
As regiões são recursos compartilhados que dependem de recursos de hardware específicos. Para garantir que todos os aplicativos possam participar do monitoramento da região, o Core Location impede que um único aplicativo monitore mais de 20 regiões simultaneamente. Para contornar essa limitação, monitore apenas as regiões próximas ao local atual do usuário. Conforme o usuário se move, atualize a lista com base no novo local do usuário.
Etapa 2: lidar com uma notificação de região
Seu app receberá uma notificação do sistema sempre que o usuário entrar ou sair de uma das regiões que seu app cadastrou. Mesmo que o aplicativo não esteja em execução quando o usuário cruzar o limite, o sistema tentará iniciar o aplicativo para lidar com a notificação.
From CLLocationManagerDelegate
podemos usar locationManager(_:didEnterRegion:)
para ser notificado quando o usuário entra na região e locationManager(_:didExitRegion:)
quando o usuário sai da região.
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
guard let region = region as? CLCircularRegion else { return }
showAlert(message: "User enter \(region.identifier)")
}
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
guard let region = region as? CLCircularRegion else { return }
showAlert(message: "User leave \(region.identifier)")
}
}
Precisamos ajustar nosso código interno locationManagerDidChangeAuthorization(_:)
para que chamemos setupGeofencing
quando o usuário permitir a authorizedAlways
permissão
extension ViewController: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .notDetermined:
print("When user did not yet determined")
case .restricted:
print("Restricted by parental control")
case .denied:
print("When user select option Dont't Allow")
case .authorizedAlways:
// setup geofencing feature and start monitoring
setupGeofencing()
case .authorizedWhenInUse:
locationManager?.requestAlwaysAuthorization()
default:
print("default")
}
}
}
Lidando com erro de geofencing
Em alguns casos, ocorre um erro ao tentar monitorar a região que definimos, o monitoramento da região pode falhar porque a própria região não pode ser monitorada ou porque houve uma falha mais geral na configuração do serviço de monitoramento da região.
Podemos ser notificados quando ocorrer um erro de geofencing implementando locationManager(_:monitoringDidFailFor:withError:)
deCLLocationManagerDelegate
extension ViewController: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, monitoringDidFailFor region: CLRegion?, withError error: Error) {
guard let region = region else {
print("The region could not be monitored, and the reason for the failure is not known.")
return
}
print("There was a failure in monitoring the region with a identifier: \(region.identifier)")
}
}
Já implementamos geofencing dentro do aplicativo. Para verificar se funciona bem, podemos simular um movimento de entrada e saída desse local usando um gpx
arquivo que contém uma lista de coordenadas que definimos. Este arquivo nos ajuda a testar se o recurso está detectando corretamente quando alguém entra e sai do local.
Etapa 1: criar arquivo gpx
Para criar um novo arquivo gpx
- Selecione o menu Arquivo > Novo > Arquivo .
- Selecione Arquivo GPX na seção Recurso e clique em Avançar
- Especifique o nome do arquivo e clique em Criar . Nesse caso, podemos nomear nosso arquivo GPX SimulateGeofencing

Para simular mudanças de local para fins de teste, podemos definir locais específicos usando um arquivo GPX . Este tutorial demonstra como definir locais fornecendo sua latitude, longitude, nome e hora. Por exemplo, podemos simular uma rota que começa no Hilton Garden Inn Cupertino e segue para o Apple Park , e depois segue para a N Tautau Ave .
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode">
<wpt lat="37.3352915" lon="-122.0203281">
<name>Hilton Garden Inn Cupertino</name>
<time>2014-09-24T14:55:37Z</time>
</wpt>
<wpt lat="37.335056" lon="-122.008548">
<name>Apple Park</name>
<time>2014-09-24T14:55:45Z</time>
</wpt>
<wpt lat="37.336105" lon="-122.000029">
<name>N Tantau Ave</name>
<time>2014-09-24T14:55:50Z</time>
</wpt>
</gpx>
Etapa 3: execute o aplicativo
Agora podemos executar nosso aplicativo e simular atualizações de localização com base no arquivo GPX criado anteriormente. Para fazer isso, precisamos definir um ponto de interrupção em nosso código e, em seguida, selecionar o arquivo GPX que queremos usar para iniciar a simulação.

Após aguardar alguns segundos, nosso aplicativo exibirá um alerta que nos informa quando o usuário entra no “apple_park” que indica que o usuário entrou na região. Após alguns segundos, nosso aplicativo exibirá outro alerta quando o usuário sair do “apple_park” que indica a saída do usuário da região.

Conclusão
Geofencing é um recurso poderoso fornecido pelo Core Location no iOS que permite que um aplicativo receba notificações quando um usuário entra ou sai de uma região geográfica configurada. Ao implementar geofencing, podemos desenvolver aplicativos baseados em localização que podem fornecer recursos úteis, como notificar um usuário quando ele entra ou sai de uma determinada área.
No entanto, é importante observar que o geofencing requer aprovação do usuário, monitoramento contínuo da localização, recursos de hardware específicos e acesso aos dados de localização do usuário, o que pode gerar preocupações com a privacidade.
Neste artigo, fornecemos um guia passo a passo para configurar e usar geofencing em um aplicativo iOS, incluindo solicitação de permissão de localização, configuração de geofencing, tratamento de erros de geofencing e depuração no simulador. Com este guia, podemos implementar facilmente geofencing em nossos aplicativos iOS e aproveitar seus poderosos recursos.