현재 위치 권한 대화 상자가 너무 빨리 사라짐


175

내 앱은 사용자의 위치를 ​​가져와 좌표를 가져오고 목적지 또는 출발지와의 거리를 제공합니다. 가능한 모든 대상이 테이블보기에 표시되므로 테이블을 채우는 것과 동시에 사용자가 좌표를 얻습니다. 유일한 것은 사용자 위치를 묻는 경고보기가 나타난 다음 너무 빨리 사라져서 클릭 할 수 없다는 것입니다!

앱이 처음로드 될 때이 경고를 수동으로 표시 할 수있는 방법이 있습니까? 앱이로드 될 때 사용자의 위치를 ​​가져 와서 경고를 표시하려고 시도했지만 작동하지 않았습니다.

답변:


699

추적하기는 어렵지만 이에 대한 해결책은 매우 간단합니다.

많은 시행 착오를 통해 앱에서 위치 서비스에 처음으로 액세스하려고 할 때 위치 액세스 대화 상자가 팝업되는 동안 CLLocationManager객체가 이전에 릴리스 되면 대화 상자가 사용자 상호 작용없이 자체적으로 사라집니다. 사용자가 대화 상자에 응답합니다.

CLLocationManagerviewDidLoad방법 으로 인스턴스를 만들고있었습니다 . 이것은 메소드의 로컬 인스턴스이므로 메소드 실행이 완료된 후 ARC에 의해 인스턴스가 해제되었습니다. 인스턴스가 해제 되 자마자 대화 상자가 사라졌습니다. 해결책은 다소 간단했습니다. 변경 CLLocationManager하는 방법 레벨의 변수가 클래스 수준의 인스턴스 변수로되는 것을 인스턴스를. 이제 CLLocationManager클래스가 언로드 된 후에 만 ​​인스턴스가 해제됩니다.


117
나는 당신에게 +100을 줄 수 있었으면 좋겠다
코더

1
Xamarin.iOS와 동일한 문제가 발생했습니다. CLLocationManager 클래스 범위를 작성하고 대화 상자를 계속 표시하십시오.
Krumelur

1
Yaaaaa .... 계속해서 자신에게 인상을 줄 수 있다면, 그것은 greeeeeaaaat 일 것입니다. (진심으로, 이것은 나에게도 큰 절약이다)
Garfonzo

2
저도이 파티에 참여해야합니다. 여기에서 나에게 인터넷 하이 파이브를 가져와!
Matthieu Riegler

3
Swift에서이 문제가 발생하면 LocationManager 선언을 viewDidLoad 외부로 이동하십시오. 건배!
KD.

5

동일한 증상, 다른 원인 : 행에서 두 번 이상 호출하지 마십시오startUpdatingLocation .

실수로 코드가 의도하지 않게 startUpdatingLocation두 번 연속 호출되도록 구성 했습니다. 네트워크 요청의 결과에 따라 업데이트를 시작하기를 기다리고 있었기 때문에 대기열 선택과 관련이 있었을 수도 있지만 GCD 마법을 사용하여 수정하지 않아도됩니다. 시작을 반복하지 않았다.

누군가 내 고통으로 혜택을 볼 수 있기를 바랍니다. :)


5

나는 비슷한 상황에 직면했다. 디버깅 후 발견

let locationManager = CLLocationManager()

메소드 범위에서 호출되지만 전역 적으로 호출되어야합니다.

왜?

간단히 말해서, 메소드가 리턴 된 후 locationManager가 해제되었습니다. 그러나 사용자가 권한을 부여하거나 거부 할 때까지 해제해서는 안됩니다.


4

나는 같은 문제에 빠져 있습니다 (적어도 증상에 의해). 필자의 경우 문제는 백그라운드 전환 준비의 일환으로 인스턴스를 - (void)applicationWillResignActive:(UIApplication *)application;릴리스 하는 방법에 CLLocationManager있습니다. 내가 그것을 제거 - (void)applicationDidEnterBackground:(UIApplication *)application;하고 문제 에만 남았을 때 사라졌습니다.
까다로운 부분은 핵심 위치 경고가 응용 프로그램이 여전히 포 그라운드에있는 동안 응용 프로그램을 일시 중단한다는 것입니다.
그것이 당신을 도울 것이라고 희망, 그 놈을 발견하는 데 많은 시간이 걸렸습니다 :)


4

답변이 늦다는 것을 알고 있습니다. 그러나 누군가를 도울 수 있습니다. 또한 같은 문제에 직면하여 문제를 식별하기 위해 한 시간을 보냈습니다. 처음에 내 코드는 다음과 같습니다.

CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];

CLLocation *location = locationManager.location;
//my stuff with the location

    [locationManager release];

이제 위치 알림이 빠르게 사라졌습니다. 마지막 줄의 주석을 해제하면 올바르게 작동합니다.

   // [locationManager release];

3
사실입니다. 이 답변에 추가 할 유일한 경고는 프로젝트에 ARC가 활성화되어 있으면 코드에 릴리스 문을 포함 할 필요가 없으며 여전히이 문제가 발생한다는 것입니다. 해당 시나리오에서이 문제를 해결하는 유일한 방법은 메서드 수준 대신 변수 클래스 수준을 만드는 것입니다.
Zoli

3

나는 또한이 문제에 부딪 쳤지 만 내 경우의 해결책은 받아 들인 대답과 완전히 다른 것으로 판명되었습니다.

내 응용 프로그램에서에서 전화 stopUpdatingLocation했습니다 applicationWillResignActive. applicationWillResignActive권한 대화 상자가 나타날 때 호출 되기 때문에 문제 가되었습니다. 이 stopUpdatingLocation바로 뒤에 발생 startUpdatingLocation했기 때문에 대화 상자가 즉시 사라집니다.

해결책은 단순히 대신 전화 stopUpdatingLocation하는 applicationDidEnterBackground것입니다.


2

이것은 iOS 시뮬레이터를 사용하는 동안 발생했습니다. Run Scheme이 위치를 시뮬레이션하고 있었기 때문에 발생하는 것으로 확인되었습니다. locationManager.startUpdatingLocation()시작시 호출하는 것과 동일한 효과가 있으므로 대화 상자를 닫고 있다고 생각합니다 .

구성표 편집 대화 상자에서 "위치 시뮬레이션 허용"확인란을 선택 취소하면 문제가 해결되었습니다. 원하는대로 작동하고 권한이 설정되면 위치 시뮬레이션을 다시 활성화 할 수 있으며 시뮬레이터는 그때부터 잘 작동합니다.


이것은 나를 위해 약간 연장되었습니다. Atleast 대화 상자를
보았습니다

2

스위프트 4와 iOS 11 :

파일 에 개인 정보 보호 라인 ( 항상InIn )을 .plist추가하고 CoreLocation프로젝트 에 프레임 워크를 추가 하십시오

변경하면 위치 권한 대화 상자가 올바르게 나타납니다.

locationManager.requestAlwaysAuthorization()

와:

locationManager.requestWhenInUseAuthorization()

추신 :. 내가 해봤 모든 조언을하고 모두가에 (요청 권한 부여에 실패 viewDidLoad, var대신 let을 locationManager를 들어, 시작하지 않는 startUpdatingLocation()request..I이 버그라고 생각 후에 나는 그들이 가능한 한 빨리 해결되기를 바랍니다 ..


나는 모든 조언을 따랐지만 항상 같은 문제가 있습니다. 위치 권한 대화 상자가 잠깐 나타난 다음 즉시 사라집니다. 그런 다음 알림 대화 상자 권한이 나타납니다 (이것은 정상입니다). 승인 또는 거절을 누르면 다른 위치 권한이 나타납니다 (이번에는 그대로 있고 수락 또는 거절하게합니다).

@BitoQ 예, 저도 마찬가지입니다. 같은 상황이지만 최소한이 대화 상자를 볼 수 있습니다. 다음 iOS 11.1에서는이 버그를 수정하기를 바랍니다.
Alessandro Ornano

1

SWIFT 4 @Zoli 솔루션은 다음과 같습니다.

class WhateverViewController: UIViewController {
    let locationManager = CLLocationManager() // here is the point of the @Zoli answer

    // some code
    override func viewDidLoad() {
        super.viewDidLoad()

        // some other code
        locationManager.requestWhenInUseAuthorization()
        // some other code
    }
}

0

locationManager 변수를 전역 객체로 가장 많이 정의합니다.

@interface ViewController : UIViewController
{
    CLLocationManager *locationManager;
}
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    [locationManager startUpdatingLocation];
}

0

나는 당신과 같은 상황을 만났습니다.

  • 내 솔루션이 로컬 변수에서 멤버 인스턴스로 변경되었습니다.
  • 원인은 로컬 변수가 포함 된 메소드가 완료 된 후 로컬? 인스턴스가 유효하지 않기 때문입니다 (내 위치 관리자 확장)
  • 내 환경 : Xcode9.3.1
#수입 
@ 인터페이스 ViewController ()

@종료

@implementation ViewController
@synthesize locManager; // 후
-(void) viewDidLoad {
    [슈퍼 viewDidLoad];
    //보기를로드 한 후 일반적으로 펜촉에서 추가 설정을 수행합니다.

    // MyLocationService * locManager = [[BSNLocationService alloc] init : nil]; // 전에. 위치. 이 메소드 후에 인스턴스가 유효하지 않아 델리게이트가 작동하지 않았습니다.
    self-> locManager = [[MyLocationService alloc] init : nil]; // 후
    locManager.startService;
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.