보안 강국의 애플..
privacy 지켜주자
Authorization
아이폰을 써 본 경험이 있다면 App 실행 시 왜 이렇게 권한을 허용을 해야하는게 많아? 라는 생각을 한번쯤 해봤을 것이다
권한은 사용방법을 공개해서 사용자와 신뢰를 구축하는 것이다.
info.plist에서 information Property List -> App Transport Security Settings 하위에서 권한 설정이 가능하다
(Privacy로 검색하면 검색하기 편하다)
MapAuthorization
infoPlist에서 위치 권한에 대하여 설정 해주었다
MapView
- Map은 지도이기 때문에 위치 권한과는 상관 없다
- 단, 지도에 위치를 표기하고 싶다면 위치 권한을 설정 해주어야한다
- 중심과 범위를 지정 해주어야 한다
*CLLocation 준비
import UIKit
import MapKit
//Location1. 임포트
import CoreLocation
class MapViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
//Location2. 위치에 대한 대부분을 담당
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
//Location3. 프로토콜 연결
locationManager.delegate = self
}
*CLLocationManagerDelegate 프로토콜을 통해서 위치, 권한 업데이트 될시에 사용되는 method 구현
//Location4. 프로토콜 선언
extension MapViewController: CLLocationManagerDelegate {
//Location5. 사용자의 위치를 성공적으로 가지고 온 경우
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print(#function, locations)
if let coordinate = locations.last?.coordinate {
setRegionAndAnnotation(center: coordinate)
}
locationManager.stopUpdatingLocation()
}
//Location6. 사용자의 위치를 못 가지고 온 경우
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
print(error)
}
//사용자가 권한 상태를 바꿀 경우
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
print(#function)
checkUserDeviceLocationServiceAuthorization()
}
//iOS 14 미만
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
}
}
locationManager.stopUpdationgLocation()을 꼭 해주어야 무한 업데이트 되는 것을 막을 수 있다
(어떻게 아냐고? 알고 싶지 않았다.. assignment하는데 start로 써서 update 무한으로 즐겼...)
* CLAuthorizationStatus를 통해 iOS 버전 확인, iOS 서비스 활성화 여부와 권한 여부 확인
extension MapViewController {
func checkUserDeviceLocationServiceAuthorization() {
let authorizationStatus: CLAuthorizationStatus
if #available(iOS 14.0, *) {
authorizationStatus = locationManager.authorizationStatus
} else {
authorizationStatus = CLLocationManager.authorizationStatus()
}
//iOS 위치 서비스 활성화 여부 체크
if CLLocationManager.locationServicesEnabled() {
checkUserCurrentLocationAuthorization(authorizationStatus)
} else {
print("위치서비스가 꺼져 있어서 위치 권한 요청을 못합니다.")
}
}
*사용자의 권한 상태에 따른 메서드 실행
func checkUserCurrentLocationAuthorization(_ authorizationStatus: CLAuthorizationStatus) {
switch authorizationStatus {
case .notDetermined:
print("NOTDETERMINED")
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
case .restricted, .denied:
print("DENIED, 아이폰 설정으로 유도")
showRequestLocationServiceAlert()
case .authorizedWhenInUse:
print("WHEN IN USE")
locationManager.startUpdatingLocation()
default: print("DEFAULT")
}
}
Alertmethod는 이전 게시물을 통해서 알 수 있지만 권한 요청이 안됐을 때 띄워주는 것으로 특별히 정해진 양식은 없으므로 만들고 싶은대로 만들어서 deni, restrict의 경우 띄워주면 된다
*사용자 위치 지정 및 핀 설정
func setRegionAndAnnotation(center: CLLocationCoordinate2D) {
let center = CLLocationCoordinate2D(latitude: 37.524496, longitude: 127.035340)
let region = MKCoordinateRegion(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000)
//위치 설정
mapView.setRegion(region, animated: true)
let annotation = MKPointAnnotation()
annotation.coordinate = center
annotation.title = "도산공원 입니다"
//핀 한개? 여러개?
//지도에 핀 추가
mapView.addAnnotation(annotation)
}
}
위도 경도 기반으로 위치를 설정해주고 중심부를 설정해준다
mapView,addAnnotation(핀 설정 1개 ) addAnnotations(핀 여러개 설정)
여러개의 핀을 설정하면 위와 같은 형태로 보여진다
'Tech > iOS' 카테고리의 다른 글
[iOS]Day43 - Access Control (0) | 2022.08.16 |
---|---|
[iOS]Day39 - Authorization - Camera (0) | 2022.08.12 |
[iOS]Day37 - AwakeFromNib, PrepareForReuse (0) | 2022.08.10 |
[iOS]Day37 - TableView+CollectionView (0) | 2022.08.09 |
[iOS]Day37 - IBInspectable/IBDesignable (0) | 2022.08.09 |