현재 위치 권한 대화 상자가 너무 빨리 사라짐
내 앱은 사용자의 위치를 파악하고 좌표를 얻으며 목적지 또는 출발지까지의 거리를 제공합니다.이 모든 가능한 수신처가 테이블 뷰에 표시되므로 사용자가 테이블을 채우는 동시에 좌표를 얻습니다.유일한 것은 사용자의 위치를 묻는 경고 보기가 나타나서 클릭할 수 없을 정도로 빠르게 사라진다는 것입니다.
앱이 처음 로드될 때 수동으로 이 경고를 표시할 수 있는 방법이 있습니까?앱이 로딩될 때 사용자 위치를 불러와 경고를 강제로 표시하려고 했지만 작동하지 않았습니다.
추적은 어렵지만 해결책은 매우 간단합니다.
많은 시행착오를 거쳐 앱의 위치 서비스에 처음 접속하려고 할 때 위치 액세스 대화상자가 뜨는 동안 사용자의 조작 없이 대화상자가 저절로 사라진다는 것을 알게 되었습니다.CLLocationManager
사용자가 대화 상자에 응답하기 전에 개체가 해제됩니다.
작성했습니다.CLLocationManager
나의 예viewDidLoad
방법.이 인스턴스는 메서드의 로컬인스턴스였기 때문에 메서드의 실행이 완료된 후 ARC에 의해 해방되었습니다.인스턴스가 공개되자마자 대화 상자가 사라졌습니다.해결책은 비교적 간단했다.를 변경하다CLLocationManager
instance를 메서드 수준 변수에서 클래스 수준 인스턴스 변수로 변경합니다.자, 이제.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
,var
let
경우 't start locationManager는startUpdatingLocation()
★★★★★하기 때문에 한 한 해결해주셨으면 .버그인 것 같아서 빨리 해결해주셨으면 좋겠습니다.
는 그...locationManager
Swift 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
'itsource' 카테고리의 다른 글
Git에서 로컬 작업 디렉토리를 지우려면 어떻게 해야 하나요? (0) | 2023.04.12 |
---|---|
iOS 업데이트 후에도 이전 시작 화면 및 앱 아이콘 유지 (0) | 2023.04.12 |
NSString에서 번호를 제외한 모든 번호 삭제 (0) | 2023.04.12 |
sql server 연결 문자열의 "연결 시간 초과"란 무엇입니까? (0) | 2023.04.12 |
모든 공백을 제거하는 루비 기능? (0) | 2023.04.12 |