Meu aplicativo que funcionou bem no iOS 7 não funciona com o SDK do iOS 8.
CLLocationManager
não retorna um local e também não vejo meu aplicativo em Configurações -> Serviços de localização . Eu fiz uma pesquisa no Google sobre o assunto, mas nada aconteceu. O que pode estar errado?
Respostas:
Acabei resolvendo meu próprio problema.
Aparentemente, no iOS 8 SDK,
requestAlwaysAuthorization
(para localização em segundo plano) ourequestWhenInUseAuthorization
(localização somente em primeiro plano), ligueCLLocationManager
é necessária a antes de iniciar as atualizações de localização.Também precisa haver
NSLocationAlwaysUsageDescription
ouNSLocationWhenInUseUsageDescription
digitarInfo.plist
uma mensagem a ser exibida no prompt. Adicionando estes resolveu o meu problema.Espero que isso ajude mais alguém.
EDIT: Para obter informações mais abrangentes, consulte: Core-Location-Manager-Changes-in-ios-8
fonte
Eu estava puxando meu cabelo com o mesmo problema. O Xcode fornece o erro:
Mas mesmo se você implementar um dos métodos acima, ele não solicitará ao usuário, a menos que haja uma entrada no info.plist para
NSLocationAlwaysUsageDescription
ouNSLocationWhenInUseUsageDescription
.Adicione as seguintes linhas ao seu info.plist em que os valores da sequência representam o motivo pelo qual você precisa acessar a localização dos usuários
Eu acho que essas entradas podem estar ausentes desde que iniciei este projeto no Xcode 5. Acho que o Xcode 6 pode adicionar entradas padrão para essas chaves, mas não foi confirmado.
Você pode encontrar mais informações sobre essas duas configurações aqui
fonte
Para garantir que isso seja compatível com o iOS 7, verifique se o usuário está executando o iOS 8 ou iOS 7. Por exemplo:
fonte
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
requestAlwaysAuthorization
método. Minha solução adicional era usar esta linha naif
declaração, em vez de uma chamada de método normal:[self.locationManager performSelector:@selector(requestAlwaysAuthorization)];
. Talvez isso seja óbvio para outras pessoas, mas levei um tempo para descobrir. Eu acho que é a solução certa até o final do Xcode 6 ser lançado.__IPHONE_OS_VERSION_MAX_ALLOWED
(#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
)E para o seu arquivo info.plist
fonte
De acordo com os documentos da Apple:
No iOS 8, é necessária a presença de um valor-chave
NSLocationWhenInUseUsageDescription
ouNSLocationAlwaysUsageDescription
no arquivo Info.plist do seu aplicativo. Também é necessário solicitar permissão do usuário antes de se registrar para atualizações de local, ligando[self.myLocationManager requestWhenInUseAuthorization]
ou[self.myLocationManager requestAlwaysAuthorization]
dependendo da sua necessidade. A seqüência que você inseriu no Info.plist será exibida na caixa de diálogo a seguir.Se o usuário conceder permissão, os negócios serão normais. Se eles negarem permissão, o delegado não será informado das atualizações de local.
fonte
Ambas as teclas recebem uma string
fonte
Minha solução que pode ser compilada no Xcode 5:
fonte
O código antigo para perguntar a localização não funcionará no iOS 8. Você pode tentar este método para obter autorização de localização:
fonte
No iOS 8, você precisa fazer duas coisas extras para que o local funcione: adicione uma chave ao seu Info.plist e solicite autorização ao gerente do local, solicitando que ele inicie
info.plist:
Adicione isto ao seu código
fonte
Um erro comum para desenvolvedores Swift:
Primeiro, certifique-se de adicionar um valor ao plist para um
NSLocationWhenInUseUsageDescription
ou outroNSLocationAlwaysUsageDescription
.Se você ainda não estiver vendo uma janela solicitando autorização, verifique se está colocando a linha
var locationManager = CLLocationManager()
noviewDidLoad
método do seu View Controller . Se você o fizer, mesmo se ligarlocationManager.requestWhenInUseAuthorization()
, nada será exibido. Isso ocorre depois que o viewDidLoad é executado, a variável locationManager é desalocada (limpa).A solução é localizar a linha
var locationManager = CLLocationManager()
na parte superior do método da classe.fonte
Antes
[locationManager startUpdatingLocation];
, adicione uma solicitação de serviços de localização iOS8:Edite o aplicativo
Info.plist
e adicione a chaveNSLocationAlwaysUsageDescription
com o valor da string que será exibido ao usuário (por exemplo,We do our best to preserve your battery life.
)Se o seu aplicativo precisar de serviços de localização apenas enquanto o aplicativo estiver aberto, substitua:
requestAlwaysAuthorization
comrequestWhenInUseAuthorization
eNSLocationAlwaysUsageDescription
comNSLocationWhenInUseUsageDescription
.fonte
Eu estava trabalhando em um aplicativo que foi atualizado para o iOS 8 e os serviços de localização pararam de funcionar. Você provavelmente receberá um erro na área de Depuração da seguinte forma:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
Eu fiz o procedimento menos invasivo. Primeiro adicione a
NSLocationAlwaysUsageDescription
entrada ao seu info.plist:Observe que eu não preenchi o valor dessa chave. Isso ainda funciona e não estou preocupado porque esse é um aplicativo interno. Além disso, já existe um título solicitando o uso de serviços de localização, então não queria fazer nada redundante.
Em seguida, criei uma condicional para o iOS 8:
Depois disso, o
locationManager:didChangeAuthorizationStatus:
método é chamado:E agora tudo funciona bem. Como sempre, confira a documentação .
fonte
Solução com compatibilidade com versões anteriores:
Configure a chave NSLocationWhenInUseUsageDescription no seu Info.plist
fonte
locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error
. No entanto, ele esqueceu de adicionar startUpdatingLocation na instrução if, portanto, depois que eles aceitam ou negam, na verdade, ele não chama startUpdateLocation.Solução com compatibilidade com versões anteriores que não produz avisos do Xcode:
NSLocationWhenInUseUsageDescription
Chave de instalação no seuInfo.plist
.Para iOS versão 11.0+ :
NSLocationAlwaysAndWhenInUseUsageDescription
chave de configuração no seuInfo.plist
. juntamente com outras 2 teclas.fonte
This is issue with ios 8 Adicione isso ao seu código
e para info.plist:
fonte
NSLocationUsageDescription
não é usado em iOS8Para acessar a localização do usuário no iOS 8, você precisará adicionar,
Isso solicitará ao usuário a permissão para obter sua localização atual.
fonte
Procedimento Objective-C Siga as instruções abaixo:
Para iOS-11 Para iOS 11, consulte esta resposta: Acesso à localização do iOS 11
É necessário adicionar duas chaves ao plist e fornecer a mensagem conforme a imagem abaixo:
Para iOS-10 e abaixo:
Métodos de delegação
Procedimento Rápido
Siga as instruções abaixo:
Para iOS-11 Para iOS 11, consulte esta resposta: Acesso à localização do iOS 11
É necessário adicionar duas chaves ao plist e fornecer a mensagem conforme a imagem abaixo:
Para iOS-10 e abaixo:
Métodos de delegação
fonte
Para aqueles que usam o Xamarin , tive que adicionar a chave
NSLocationWhenInUseUsageDescription
ao info.plist manualmente, pois ela não estava disponível nas listas suspensas no Xamarin 5.5.3 Build 6 ou no XCode 6.1 - apenasNSLocationUsageDescription
estava na lista e isso fezCLLocationManager
com que continuasse a falhar silenciosamente.fonte
fonte
Um pequeno auxiliar para todos vocês que têm mais de um arquivo Info.plist ...
Ele adicionará a marca necessária a todos os arquivos Info.plist no diretório atual (e subpastas).
Outro é:
Ele adicionará sua descrição a todos os arquivos.
fonte
Mantenha as informações da Cocoa Keys sempre ao seu alcance para essas atualizações, aqui está o link:
https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26
Aproveitar.
fonte
Eu recebo um erro semelhante no iOS9 (trabalhando com o Xcode 7 e Swift 2): Tentando iniciar as atualizações de localização do MapKit sem solicitar a autorização da localização. Deve chamar - [CLLocationManager requestWhenInUseAuthorization] ou - [CLLocationManager requestAlwaysAuthorization] primeiro. Eu estava seguindo um tutorial, mas o tutor estava usando o iOS8 e o Swift 1.2. Existem algumas alterações no Xcode 7 e no Swift 2, encontrei esse código e ele funciona bem para mim (se alguém precisar de ajuda):
Finalmente, coloquei isso em info.plist: Information Property List: NSLocationWhenInUseUsageDescription Value: aplicativo precisa de servidores de localização para a equipe
fonte
Para acessar a localização dos usuários no iOS. Você precisa adicionar duas chaves
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
no arquivo Info.plist.
Veja esta imagem abaixo.
fonte
Adicione a tecla
NSLocationWhenInUseUsageDescription
ouNSLocationAlwaysUsageDescription
(uso em segundo plano do GPS) com a corda pedindo para usar o GPS em cada uminfo.plist
de cada alvo.Peça permissão executando:
[self initLocationManager: locationManager];
Onde
initLocationManager
fica:Lembre-se de que se as chaves não estiverem em cada uma
info.plist
para cada destino, o aplicativo não perguntará ao usuário. Eleif
oferece compatibilidade com o iOS 7 e orespondsToSelector:
método garante compatibilidade futura, em vez de apenas resolver o problema do iOS 7 e 8.fonte
O problema para mim era que a classe
CLLocationManagerDelegate
era privada, o que impedia que todos os métodos delegados fossem chamados. Acho que não é uma situação muito comum, mas pensei em mencioná-la para o caso de ajudar alguém.fonte
Acrescento aqueles chave no
InfoPlist.strings
no iOS 8.4, mini-iPad 2. Ele funciona também. Eu não ponho nenhuma chaveNSLocationWhenInUseUsageDescription
no meuInfo.plist
.InfoPlist.strings :
A base desse segmento , segundo ele
as in iOS 7
, pode ser localizada no InfoPlist.strings. No meu teste, essas chaves podem ser configuradas diretamente no arquivoInfoPlist.strings
.ATUALIZAR:
Eu acho que
@IOS
o método é melhor. Adicione chave aInfo.plist
com valor vazio e adicione cadeias localizadas aInfoPlist.strings
.fonte