GoogleMapSDK+Geofence 설치
이번에 Geoffence를 실현하기 위해 여기에 코드를 추가합니다
* 기본적으로 여기. 와 동일
인증 요청 변경
info.plist 수정
지난번과 같으면 info.plist 위치 정보 이용 설정이
Privacy - Location When In Use Usage Description
에만 한정되어 있기 때문에, "사용 중만 허용"으로 설정할 수 있는지 물어보면, "항상 허용"은 선택 항목으로 표시할 수 없습니다이번엔 백스테이지에서도 사용하려고 추가
Privacy - Location Always and When In Use Usage Description
그리고 코드locationManager.requestWhenInUseAuthorization
를 locationManager.requestAlwaysAuthorization()
로 바꾸면 완성됩니다.참고로 사용 중에만 인증 요청에 표시가 허용되더라도 인증 요청에 "항상 표시"만 표시될 수는 없습니다.
이 보도에서 언급한 바와 같이 iOS 10 이전에는 "자주 허용""사용만 허용"중 어느 지원만 있으면 됩니다.
iOS 11부터 "사용 가능"지원만 필요하므로
모니터링할 위도 경도 및 영역 설정
import GoogleMaps
class ViewController: UIViewController, CLLocationManagerDelegate {
// モニタリングしたい場所の緯度経度を設定
let moniteringCoordinate = CLLocationCoordinate2DMake(-33.86,151.20)
(以下省略)
}
extension ViewController {
func startGeofenceMonitering() {
// モニタリングしたい領域を作成
let moniteringRegion = CLCircularRegion(center: moniteringCoordinate, radius: 100, identifier: "シドニー")
// モニタリング開始
locationManager.startMonitoring(for: moniteringRegion)
}
}
extension ViewController {
// 認証ステータスが変わったときに呼ばれる
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
case .notDetermined:
print("ユーザー認証未選択")
break
case .denied:
print("ユーザーが位置情報取得を拒否しています。")
//位置情報取得を促す処理を追記
break
case .restricted:
print("位置情報サービスを利用できません")
break
case .authorizedWhenInUse:
print("アプリケーション起動時のみ、位置情報の取得を許可されています。")
break
case .authorizedAlways:
print("このアプリケーションは常時、位置情報の取得を許可されています。")
break
default:
break
}
}
// ジオフェンスモニタリング
// モニタリング開始成功時に呼ばれる
func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
print("モニタリング開始")
}
// モニタリングに失敗したときに呼ばれる
func locationManager(_ manager: CLLocationManager, monitoringDidFailFor region: CLRegion?, withError error: Error) {
print("モニタリングに失敗しました")
}
// ジオフェンス領域に入ったときに呼ばれる
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
print("設定したジオフェンスに入りました")
}
// ジオフェンス領域から出たときに呼ばれる
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
print("設定したジオフェンスから出ました")
}
// ジオフェンスの情報が取得できないときに呼ばれる
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("モニタリングエラーです")
}
}
동작은 확인되지 않았지만 아마 이렇게 하면 정상적으로 작동할 수 있을 것이다표시 영역
이 가능하다, ~할 수 있다,...
다음 코드를 추가하여 이전 트랙을 세우십시오
let circle = GMSCircle.init(position: moniteringCoordinate, radius: 100)
circle.position = moniteringCoordinate
circle.radius = 100
circle.fillColor = .red
circle.map = mapView
이렇게 구역이 가시화됩니다.전체 코드
import GoogleMaps
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
// モニタリングしたい場所の緯度経度を設定
let moniteringCoordinate = CLLocationCoordinate2DMake(-33.86,151.20)
override func viewDidLoad() {
super.viewDidLoad()
setUpMapView()
setupLocationManager()
}
func setUpMapView() {
// マップに指定の緯度経度の場所を指定の倍率で表示するように指示
let camera = GMSCameraPosition.camera(withLatitude: -33.86, longitude: 151.20, zoom: 10.0)
// 指定のフレームとcameraPositionでmapviewをビルドして返す
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: camera)
mapView.isMyLocationEnabled = true
// markerはピンの場所
let marker = GMSMarker()
marker.position = CLLocationCoordinate2D(latitude: -33.86, longitude: 151.20)
marker.title = "Sydney"
marker.snippet = "Australia"
marker.map = mapView
let circle = GMSCircle.init(position: moniteringCoordinate, radius: 100)
circle.position = moniteringCoordinate
circle.radius = 100
circle.fillColor = .red
circle.map = mapView
view = mapView
}
func setupLocationManager() {
// ユーザーに対して位置情報を取得する許可をリクエストする
// 常に使用する許可を得るrequestAlwaysAuthorizationとアプリ使用中のみ許可を得るrequestWhenInUseAuthorizationがある
// ここでrequestWhenInUseAuthorization()でリクエストするならinfo.plistの方もPrivacy - Location When In Use Usage Descriptionにする必要がある
// ここでrequestAlwaysAuthorization()でリクエストするならinfo.plistの方も Privacy - Location Always and When In Use Usage Descriptionにする必要がある
// info.plistが違う項目を設定しているとリクエストができないため現在地が取得できない
locationManager.requestAlwaysAuthorization()
// 「アプリ使用中の位置情報取得」の許可が得られた場合のみ、CLLocationManagerクラスのstartUpdatingLocation()を呼んで、位置情報の取得を開始する
if .authorizedAlways == CLLocationManager.authorizationStatus() {
// 許可が得られた場合にViewControllerクラスがCLLoacationManagerのデリゲート先になるようにする
locationManager.delegate = self
// 何メートル移動ごとに情報を取得するか。ここで設定した距離分移動したときに現在地を示すマーカーも移動する
locationManager.distanceFilter = 1
// 位置情報取得開始
locationManager.startUpdatingLocation()
// モニタリング開始
startGeofenceMonitering()
}
}
}
extension ViewController {
func startGeofenceMonitering() {
// モニタリングしたい領域を作成
let moniteringRegion = CLCircularRegion(center: moniteringCoordinate, radius: 100, identifier: "シドニー")
// モニタリング開始
locationManager.startMonitoring(for: moniteringRegion)
}
}
extension ViewController {
// 位置情報を取得・更新するたびに呼ばれる
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations.first
let latitude = location?.coordinate.latitude
let longitude = location?.coordinate.longitude
print("latitude: \(latitude!)\n longitude: \(longitude!)")
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
case .notDetermined:
print("ユーザー認証未選択")
break
case .denied:
print("ユーザーが位置情報取得を拒否しています。")
//位置情報取得を促す処理を追記
break
case .restricted:
print("位置情報サービスを利用できません")
break
case .authorizedWhenInUse:
print("アプリケーション起動時のみ、位置情報の取得を許可されています。")
break
case .authorizedAlways:
print("このアプリケーションは常時、位置情報の取得を許可されています。")
break
default:
break
}
}
// ジオフェンスモニタリング
// モニタリング開始成功時に呼ばれる
func locationManager(_ manager: CLLocationManager, didStartMonitoringFor region: CLRegion) {
print("モニタリング開始")
}
// モニタリングに失敗したときに呼ばれる
func locationManager(_ manager: CLLocationManager, monitoringDidFailFor region: CLRegion?, withError error: Error) {
print("モニタリングに失敗しました")
}
// ジオフェンス領域に入ったときに呼ばれる
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
print("設定したジオフェンスに入りました")
}
// ジオフェンス領域から出たときに呼ばれる
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
print("設定したジオフェンスから出ました")
}
// ジオフェンスの情報が取得できないときに呼ばれる
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print("モニタリングエラーです")
}
}
인용하다
https://qiita.com/powerispower/items/39203e1e908149fead19
https://qiita.com/koogawa/items/83883a0282207be7751c
추기
두 가지를 추서하다
새로운 인증 요청이 들어온 것 같아요.
https://jp.techcrunch.com/2019/06/05/2019-06-03-apple-ios-13-location-privacy/
'한 번만'은 어떤 용례일까요?
그리고 상당히 큰 것은 r equest Always Authorization을 두드려도 iOS 13은 '상시 허가' 옵션을 표시하지 않습니다. 표시하려면 '사용 시 허가' 를 선택하지 않으면 '상시 허가' 를 표시할 수 없습니다.
자세한 내용은 아래의 문장을 참조하시오.
https://qiita.com/YujiHamada3/items/3d750c336ecfb51677d0
https://japanese.engadget.com/2019/08/19/ios-13-ceo/
Privacy - Location Always and When In Use Usage Description
와 Privacy - Location When In Use Usage Description
두 개의 상황을 설정하였다value를 다르게 하지 않으면 지원해야 하는 '사용할 때만 허용' 만 표시하고 선택 항목에 '항상 허용'
아니면 Prevacy-Location Always Usage Description이 필요합니까...
Reference
이 문제에 관하여(GoogleMapSDK+Geofence 설치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/powerispower/items/6a1e8f5b95774678314c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)