itsource

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

mycopycode 2023. 4. 12. 22:21
반응형

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

내 앱은 사용자의 위치를 파악하고 좌표를 얻으며 목적지 또는 출발지까지의 거리를 제공합니다.이 모든 가능한 수신처가 테이블 뷰에 표시되므로 사용자가 테이블을 채우는 동시에 좌표를 얻습니다.유일한 것은 사용자의 위치를 묻는 경고 보기가 나타나서 클릭할 수 없을 정도로 빠르게 사라진다는 것입니다.

앱이 처음 로드될 때 수동으로 이 경고를 표시할 수 있는 방법이 있습니까?앱이 로딩될 때 사용자 위치를 불러와 경고를 강제로 표시하려고 했지만 작동하지 않았습니다.

추적은 어렵지만 해결책은 매우 간단합니다.

많은 시행착오를 거쳐 앱의 위치 서비스에 처음 접속하려고 할 때 위치 액세스 대화상자가 뜨는 동안 사용자의 조작 없이 대화상자가 저절로 사라진다는 것을 알게 되었습니다.CLLocationManager사용자가 대화 상자에 응답하기 전에 개체가 해제됩니다.

작성했습니다.CLLocationManager나의 예viewDidLoad방법.이 인스턴스는 메서드의 로컬인스턴스였기 때문에 메서드의 실행이 완료된 후 ARC에 의해 해방되었습니다.인스턴스가 공개되자마자 대화 상자가 사라졌습니다.해결책은 비교적 간단했다.를 변경하다CLLocationManagerinstance를 메서드 수준 변수에서 클래스 수준 인스턴스 변수로 변경합니다.자, 이제.CLLocationManager인스턴스는 클래스가 언로드된 후에만 해방됩니다.

같은 증상, 다른 원인: 연속해서 여러전화를 걸지 마십시오.

실수로 코드가 의도치 않게 호출되도록 구성했습니다.startUpdatingLocation두 번 연속으로, 확실히 안 좋은 것 같아요.또한 네트워크 요청 결과가 나올 때까지 업데이트를 기다리고 있었기 때문에 큐의 선택과 관련이 있을 수 있지만, 이를 수정하기 위해 GCD 매직이 필요하지 않았습니다.내가 처음부터 다시 시작하지 않도록 확실히 해야 했어요

누군가 내 고통에서 이득을 볼 수 있기를 바란다.:)

나도 비슷한 상황에 직면했다.디버깅을 한 결과

let locationManager = CLLocationManager()

메서드 범위 내에서 호출되지만 글로벌하게 호출해야 합니다.

왜요?

즉, location Manager는 메서드가 반환된 후에 출시되었습니다.그러나 사용자가 권한을 주거나 거부할 때까지 릴리스하면 안 됩니다.

나는 같은 문제에 빠진다(적어도 증상으로).제 경우 문제는- (void)applicationWillResignActive:(UIApplication *)application;Method, 그 때 나는 내 앨범을 발매하고 있었다.CLLocationManager백그라운드 이행 준비의 일부로서 인스턴스(instance)를 설정합니다.지우고 안에만 두었을 때- (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 시뮬레이터를 사용하는 동안 이 현상이 발생했습니다.실행 스킴이 로케이션을 시뮬레이트하고 있기 때문에 발생하고 있다고 판단했습니다.이건 전화하는 것과 같은 효과가 있는 것 같아요.locationManager.startUpdatingLocation()대화 상자를 닫았습니다.

[구성표 편집] 대화상자의 [위치 시뮬레이션 허용]체크박스를 끄면 문제가 해결되었습니다.원하는 대로 작동하고 권한이 설정되면 위치 시뮬레이션을 다시 활성화하면 시뮬레이터가 정상적으로 작동합니다.

Swift 4 및 iOS 11:

개인 정보 회선(항상 및 whenInUse)을 에 추가해 주세요..plist및 add " " " 。CoreLocation

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

locationManager.requestAlwaysAuthorization()

포함:

locationManager.requestWhenInUseAuthorization()

추신: 모든 조언을 시도했지만 모두 실패했습니다(승인 요청).viewDidLoad,varlet경우 't start locationManager는startUpdatingLocation()★★★★★하기 때문에 한 한 해결해주셨으면 .버그인 것 같아서 빨리 해결해주셨으면 좋겠습니다.

는 그...locationManagerSwift 5, Xcode 11(Xcode 11) 인스턴스 var.

class MapViewController: UIViewController {
    
    var locationManager: CLLocationManager {
        let locationManager = CLLocationManager()
        locationManager.desiredAccuracy = .greatestFiniteMagnitude
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        return locationManager
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.startUpdatingLocation()
    }
}

「」, 「」를 한다.locationManager했습니다.var lazy가 문제를 해결했습니다.

class MapViewController: UIViewController {

    lazy var locationManager: CLLocationManager = {
        let locationManager = CLLocationManager()
        locationManager.desiredAccuracy = .greatestFiniteMagnitude
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        return locationManager
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.startUpdatingLocation()
    }
}

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

대부분의 경우 locationManager 변수를 글로벌오브젝트로 정의합니다.

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

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

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

나도 너와 같은 상황을 만났어.

  • 솔루션이 로컬 변수에서 멤버 인스턴스로 변경되었습니다.
  • 원인은 로컬 변수(extend my location Manager)를 포함하는 메서드가 완료된 후 로컬 인스턴스가 비활성화되었기 때문입니다.
  • 환경: Xcode9.3.1

# Import@interface ViewController()
@end
@implementation View Controller@synthe size locManager; // 이후- (void)viewDidLoad {[ super view Did Load ];
// 일반적으로 니브에서 보기를 로드한 후 추가 설정을 수행합니다.

//MyLocationService *locManager = [[BSNLocationService allocation]init:manager]; // 이전.이 메서드 이후에 인스턴스가 비활성화되었기 때문에 loc. delegate가 작동하지 않았습니다.
self->locManager=[MyLocationServiceallocation]init:self]; // 이후locManager.startService;}

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

반응형