Solicitação de Autorização de Localização
Lide corretamente com permissões e privacidade.
Solicitação de Autorização de Localização é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 4 aulas no total.
Por que a localização precisa de permissão
Nas plataformas da Apple, acessar a localização do usuário é uma operação sensível à privacidade. Seu app deve solicitar autorização explicitamente antes que o Core Location forneça quaisquer coordenadas. O sistema exibe uma caixa de diálogo de permissão na primeira vez que você faz a solicitação.
- A autorização é concedida pelo usuário para cada app.
- Você não pode ignorá-la programaticamente.
import CoreLocation
let manager = CLLocationManager()Chaves de descrição de uso do Info.plist
Antes de solicitar autorização, você deve adicionar uma string de descrição de uso ao Info.plist. Essas strings são exibidas ao usuário na caixa de diálogo de permissão. As duas principais são:
NSLocationWhenInUseUsageDescription— para acesso somente em primeiro plano.NSLocationAlwaysAndWhenInUseUsageDescription— também para acesso em segundo plano.
Omitir a chave relevante faz com que a solicitação falhe silenciosamente ou cause uma falha do app.
<!-- Info.plist -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show nearby places.</string>Criando o CLLocationManager
CLLocationManager é o objeto central que coordena os serviços de localização. Você cria uma instância, mantém uma referência forte a ela e atribui um delegado para receber os retornos de chamada.
final class LocationService: NSObject {
let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
}
}Solicitando autorização durante o uso
Chame requestWhenInUseAuthorization() para solicitar acesso em primeiro plano. O sistema apresenta a caixa de diálogo apenas uma vez; depois disso, a escolha é memorizada. Se a escolha já tiver sido determinada, a chamada não faz nada.
func requestPermission() {
manager.requestWhenInUseAuthorization()
}Solicitando autorização sempre
Para atualizações em segundo plano (delimitação geográfica e rastreamento contínuo), chame requestAlwaysAuthorization(). A Apple exige que você obtenha primeiro a autorização durante o uso e depois passe para a autorização sempre. Use-a com moderação e justifique-a na descrição de uso.
func requestAlways() {
manager.requestAlwaysAuthorization()
}Lendo o estado da autorização
O estado atual da permissão fica em manager.authorizationStatus (uma propriedade de instância no iOS 14 e posteriores). Os valores possíveis incluem .notDetermined, .denied, .restricted, .authorizedWhenInUse e .authorizedAlways.
let status = manager.authorizationStatus
switch status {
case .notDetermined: print("Ask the user")
case .denied, .restricted: print("No access")
case .authorizedWhenInUse, .authorizedAlways: print("Good to go")
@unknown default: break
}O CLLocationManagerDelegate
As alterações de autorização são entregues de forma assíncrona por meio do delegado. Implemente locationManagerDidChangeAuthorization(_:) para reagir quando o usuário fizer uma escolha. Nunca presuma que a permissão foi concedida imediatamente após chamar a solicitação.
extension LocationService: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
manager.startUpdatingLocation()
default:
print("Not authorized")
}
}
}Lidando com acesso negado ou restrito
Se o usuário negar o acesso, você não poderá solicitar a permissão novamente. Em vez disso, detecte .denied e oriente-o até Configurações. .restricted significa que o acesso está bloqueado por controles parentais ou por um perfil de MDM e também não pode ser recuperado dentro do app.
func handle(_ status: CLAuthorizationStatus) {
if status == .denied {
// Deep-link the user to Settings > Privacy > Location
print("Open Settings to enable location")
}
}Autorização de precisão (precisa vs. reduzida)
Desde o iOS 14, os usuários podem conceder apenas precisão reduzida (aproximada). Verifique manager.accuracyAuthorization. Se você realmente precisar de dados precisos (por exemplo, para instruções curva a curva), chame requestTemporaryFullAccuracyAuthorization(withPurposeKey:) com uma chave definida no Info.plist.
if manager.accuracyAuthorization == .reducedAccuracy {
manager.requestTemporaryFullAccuracyAuthorization(
withPurposeKey: "PreciseForNavigation"
)
}Verificando se os serviços de localização estão ativados
Além da permissão por app, a opção de Serviços de Localização em todo o dispositivo pode estar desativada. Verifique CLLocationManager.locationServicesEnabled() em uma fila em segundo plano (chamá-la na thread principal pode bloquear a execução). Se estiverem desativados, nenhum app receberá a localização.
DispatchQueue.global().async {
if CLLocationManager.locationServicesEnabled() {
print("System location is on")
} else {
print("System location is off")
}
}Um fluxo completo de autorização
Reunindo tudo: crie o gerenciador, defina o delegado, solicite a autorização durante o uso e, em seguida, inicie as atualizações dentro do retorno de chamada de autorização. Esse é o padrão tradicional para qualquer recurso que use localização.
final class LocationService: NSObject, CLLocationManagerDelegate {
let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ m: CLLocationManager) {
if m.authorizationStatus == .authorizedWhenInUse {
m.startUpdatingLocation()
}
}
}Verificação rápida: autorização
Teste sua compreensão do fluxo de autorização.
Recapitulação: solicitando autorização
Você aprendeu a solicitar a permissão de localização com segurança:
- Adicione
NSLocationWhenInUseUsageDescription(e a variante Always, se necessário) ao Info.plist. - Crie um
CLLocationManager, mantenha uma referência forte e defina seu delegado. - Chame
requestWhenInUseAuthorization()e passe para Always somente se for necessário. - Reaja em
locationManagerDidChangeAuthorization(_:)e lide com os casos de acesso negado, restrito e de precisão reduzida.
Perguntas Frequentes
A aula “Solicitação de Autorização de Localização” é grátis?
Sim — o texto completo de “Solicitação de Autorização de Localização” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 4 aulas no total.
O que vou aprender em “Solicitação de Autorização de Localização”?
Lide corretamente com permissões e privacidade. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Solicitação de Autorização de Localização”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Solicitação de Autorização de Localização
- Obtenção da Localização do Usuário
- Exibição de Mapas no SwiftUI
- Geocodificação e Regiões