programing tip

Xcode / iOS 시뮬레이터 : 중요한 위치 변경을 수동으로 트리거

itbloger 2020. 10. 18. 08:39
반응형

Xcode / iOS 시뮬레이터 : 중요한 위치 변경을 수동으로 트리거


이 알림에 등록 된 모든 애플리케이션을 깨우는 중요한 위치 변경 알림을 발송하도록 장치에 수동으로 지시하는 방법이 있습니까? 이것은 테스트 전용이며이 비공개 API 호출은 앱 스토어에 제출할 때 거부된다는 것을 알고 있습니다.


그래서 두 가지 대답 :

A) 기차에 올라 타세요 :-)

B) 시뮬레이터를 사용하십시오. iOS 5.x 시뮬레이터에는 위치 하위 메뉴가있는 디버그 메뉴가 있습니다. 고속도로 드라이브를 선택하십시오. 이것은 북부 캘리포니아의 경치 좋은 280을 내려가는 상상의 여정에서 시뮬레이터를 시작합니다. 보기를 제외한 모든 것을 제공합니다. 앱은 중요한 위치 변경 업데이트 를 받게되며, 일시 중지 된 경우 백그라운드 에서도 실행됩니다 .

실제로 움직이고 있는지 확인하려면 시뮬레이터에서 safari를 시작하고 maps.google.com으로 이동하여 내 위치 추적 버튼을 클릭합니다. 움직여야합니다.

대박! 이제 시스템에서 시작되는 수명주기 문제를 디버깅하는 방법은 무엇입니까? 쉬운! xCode가 디버깅을 시작하기 위해 앱이 시작될 때까지 기다리도록합니다. 구성표 메뉴에서 구성표 편집을 선택하십시오. Run Scheme 및 Info 탭에서 "Launch"설정에 대해 " Wait for My.app to launch "를 선택합니다.

시뮬레이터에서 앱을 한 번 실행하여 위치 업데이트 모니터링을 시작한 다음 강제 종료하여 일시 중단되도록합니다. 응용 프로그램에 중단 점추가하면 기능 실행이 완료되고 기다립니다. 시뮬레이터가 충분히 멀리 이동하자마자 애플리케이션이 깨어나고 중단 점에 도달하고 돈을 벌 수 있습니다.

그러나 실제로 기차 타기가 더 재미 있습니다.


글쎄, 나는 비행기 모드 및 / 또는 WiFi를 켜고 끄는 것으로 이것을 할 수 있음을 발견했습니다. 비행기 모드에서 기기로 앱을 시작한 다음 앱을 닫고 비행기 모드를 끄십시오. 그러면 GPS가 켜지고 위치 업데이트가 전달됩니다.


또한 중요한 변경 모니터링을 사용하는 종료 된 앱의 재실행을 테스트하고 싶었습니다. 시작 옵션 사전의 위치 키로 시작될 때 로컬 알림을 표시하도록 코드를 작성했습니다.

시뮬레이터에서 앱을 실행했습니다. 그런 다음 멀티 태스킹 바에서 죽였습니다. 그런 다음 iOS 시뮬레이터의 위치를 ​​사용자 지정 위치로 설정합니다. 시뮬레이터를 종료하고 다시 시작했습니다. 내 앱이 중요한 위치 업데이트를 수신하고 로컬 알림을 표시했습니다.


나는 동일한 문제, 'startMonitoringSignificantLocationChanges'를 테스트하는 방법과 일시 중지되었을 때 내 앱이 위치 업데이트를 수신하는지 확인하는 방법으로 어려움을 겪었습니다.

중단 점에서 실행을 잡을 수는 없었지만 새 위치 데이터를 서버로 전송하여 구현 결과를 확인할 수있었습니다.

전체 흐름 :- 'startMonitoringSignificantLocationChanges'및 위치 위도와 경도를 업데이트하기위한 내 서버에 대한 API 호출로 구현 됨-위치 업데이트 백그라운드 모드 기능을 true로 설정-위치 관리자가 시작되고 앱이 수신하도록 앱을 실행합니다. 위치 변경-앱 강제 종료-디버그-> 시뮬레이터의 위치를 ​​고속도로 주행으로 설정-지도를 열어 위치가 변경되는지 확인-서버에서 위치 업데이트를 기다렸고 약 3 분마다 새로운 결과를 얻었습니다.

그러나 실제 장치에서 이것이 충분히 괜찮은지 아직 확실하지 않습니다.

저는 Xcode 버전 6.0.1 (6A317)에서 작업하고 있습니다. Simulator iPhone 5s (8.0)에서 테스트되었습니다.


시나리오에 따라 두 가지 솔루션을 제안합니다.

  1. 주기적으로 stopMonitoringSignificantLocationChanges를 호출 한 다음 startMonitoringSignificantLocationChanges를 호출하는 Timer 또는 LocalNotification을 사용하여 코드로 보낼 새 위치를 트리거해야합니다 (이전과 동일한 위치 일 수 있음).

  2. 디버그 빌드에서 시작하고 CLLocationManager와 같은 동일한 델리게이트 메서드를 호출하는 자체 GPS 시뮬레이터를 빌드합니다.


iOS 7 및 Xcode 5.1.1에서 알아 차린 한 가지-SLC 이벤트가 앱을 백그라운드 모드로 실행할 것으로 예상하는 경우 설정 한 중단 점에 도달 할 수도 있고 그렇지 않을 수도 있습니다. 나를 위해 때때로 NSLog 메시지가 표시되지 않습니다.

이 경우 시스템 로그에서 NSLog 출력을 볼 수 있습니다. iOS 시뮬레이터의 디버그 메뉴에서 시스템 로그를 열 수 있습니다.


MagicSeth의 답변에 추가하여 시뮬레이터 대신 실제 장치에서 이것을 테스트해야하는 경우 UIApplication.LaunchOptionsKey.location설정 앱의 일반> 개인 정보 화면에서 위치 서비스를 비활성화했다가 다시 활성화 하여 키로 백그라운드 실행을 트리거 할 수 있습니다.


iOS 4에서는 중요한 위치 변경 사항을 등록 할 수 있습니다. Apple 문서에서 :이 서비스를 사용하면 사용자의 위치가 크게 변경 될 때만 위치 업데이트가 생성됩니다. 따라서 사용자에게 중요하지 않은 위치 관련 정보를 제공하는 소셜 애플리케이션 또는 애플리케이션에 이상적입니다. 업데이트가 발생할 때 응용 프로그램이 일시 중지되면 시스템은 업데이트를 처리하기 위해 백그라운드에서이를 깨 웁니다. 응용 프로그램이이 서비스를 시작한 다음 종료되면 새 위치를 사용할 수있게되면 시스템이 응용 프로그램을 자동으로 다시 시작합니다. 이 서비스는 iOS 4 이상에서 사용할 수 있으며 셀룰러 라디오가 포함 된 기기에서만 사용할 수 있습니다.

여기여기 에서 Apple 문서를 참조 하십시오 .

다음은 서명 위치 업데이트에 등록하는 몇 가지 예제 코드입니다.

- (void)startSignificantChangeUpdates {

// Create the location manager if it doesn't exist
if (nil == locationManager)
    locationManager = [[CLLocationManager alloc] init];

locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];

}

The docs say: if you leave this service running and your application is subsequently suspended or terminated, the service automatically wakes up your application when new location data arrives. At wake-up time, your application is put into the background and given a small amount of time to process the location data. Because your application is in the background, it should do minimal work and avoid any tasks (such as querying the network) that might prevent it from returning before the allocated time expires. If it does not, your application may be terminated.


Freeway drive

enter image description here

// MARK: - MKMapViewDelegate

  func mapView(_ mapView: MKMapView, didUpdate userLocation: MKUserLocation) {
    guard let location = userLocation.location else { return }

    print(location.speed)
  }

Well, this is not possible as the application scope is limited to its own space and such kind of notification cannot be generated with Apple Documented APIs list. Of course.. if any undocumented API is used, application will get rejection from apple due to the use of undocumented/private API.

참고URL : https://stackoverflow.com/questions/6158304/xcode-ios-simulator-trigger-significant-location-change-manually

반응형