Programing

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

lottogame 2020. 5. 31. 09:53
반응형

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


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

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


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

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

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


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

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

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


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


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

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

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

    [locationManager release];

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

   // [locationManager release];

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

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

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


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

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


스위프트 4와 iOS 11 :

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

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

locationManager.requestAlwaysAuthorization()

와:

locationManager.requestWhenInUseAuthorization()

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


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
    }
}

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

let locationManager = CLLocationManager()

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

왜?

In a nutshell, locationManager has been released after the method had returned. But it shouldn't be released until user give or deny permission


you most define locationManager variable as global object.

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

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

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

I met same situation of yours.

  • My solution was changed from local variable to member instance.
  • The cause was that the local?instance was invalid after the method was finished which includes the local the variable(of extend my locationManager)
  • My Env.: Xcode9.3.1

#import 
@interface ViewController ()

@end

@implementation ViewController
@synthesize locManager; // after
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //MyLocationService *locManager = [[BSNLocationService alloc]init:nil]; // before. the loc. delegate did not work because the instance became invalid after this method.
    self->locManager= [[MyLocationService alloc]init:nil]; // after
    locManager.startService;
}

참고URL : https://stackoverflow.com/questions/7888896/current-location-permission-dialog-disappears-too-quickly

반응형